glibc中fork系统调用传参
因为想跟踪下在新建进程时,如何处理新建进程的vruntime,所以跟踪了下fork。
以glic-2.17中ARM为例(unicore架构的没找到),实际上通过寄存器向系统调用传递的参数为:
r7: __NR_clone 120
r0: CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD
r1: NULL
r2: NULL
r3: NULL
r4: &THREAD_SELF->tid
- fork()---->__fork()---->__libc_fork()
- __libc_fork()---->INLINE_SYSCALL (clone, , \
- CLONE_CHILD_SETTID | \
- CLONE_CHILD_CLEARTID | \
- SIGCHLD, \
- NULL, NULL, NULL, &THREAD_SELF->tid)
- #define INLINE_SYSCALL(name, nr, args...) \
- ({ unsigned int _sys_result = \
INTERNAL_SYSCALL (name, , nr, args); \- if (__builtin_expect \
(INTERNAL_SYSCALL_ERROR_P (_sys_result, ), )) \- { \
- __set_errno (INTERNAL_SYSCALL_ERRNO \
(_sys_result, )); \- _sys_result = (unsigned int) -; \
- } \
- (int) _sys_result; })
- #define INTERNAL_SYSCALL(name, err, nr, args...) \
- INTERNAL_SYSCALL_RAW(SYS_ify(name), err, nr, args)
- //#define __NR_clone 120
- #define SYS_ify(syscall_name) (__NR_##syscall_name)
- //err没用使用,也没有传递宏参,第一次见到
# define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \- ({ \
- register int _a1 asm ("r0"), _nr asm ("r7"); \
- LOAD_ARGS_##nr (args) \
- _nr = name; \
- asm volatile ("swi 0x0 @ syscall " #name \
- : "=r" (_a1) \
- : "r" (_nr) ASM_ARGS_##nr \
- : "memory"); \
- _a1; })
关于宏INTERAL_SYSCALL_RAW还是满有意思的,写了个函数测试下,真实的看下库如何向系统调用传参:
- #define LOAD_ARGS_0()
- #define ASM_ARGS_0
- #define LOAD_ARGS_1(a1) \
- int _a1tmp = (int)(a1); \
- LOAD_ARGS_0 () \
- _a1 = _a1tmp;
- #define ASM_ARGS_1 ASM_ARGS_0, "r" (_a1)
- #define LOAD_ARGS_2(a1, a2) \
- int _a2tmp = (int)(a2); \
- LOAD_ARGS_1(a1) \
- register int _a2 asm ("a2") = _a2tmp;
- #define ASM_ARGS_2 ASM_ARGS_1, "r" (_a2)
- #define LOAD_ARGS_3(a1, a2, a3) \
- int _a3tmp = (int)(a3); \
- LOAD_ARGS_2 (a1, a2) \
- register int _a3 asm ("a3") = _a3tmp;
- #define ASM_ARGS_3 ASM_ARGS_2, "r" (_a3)
- #define LOAD_ARGS_4(a1, a2, a3, a4) \
- int _a4tmp = (int) (a4); \
- LOAD_ARGS_3 (a1, a2, a3) \
- register int _a4 asm ("a4") = _a4tmp;
- #define ASM_ARGS_4 ASM_ARGS_3, "r" (_a4)
- #define LOAD_ARGS_5(a1, a2, a3, a4, a5) \
- int _v1tmp = (int)(a5); \
- LOAD_ARGS_4 (a1, a2, a3, a4) \
- register int _v1 asm ("v1") = _v1tmp;
- #define ASM_ARGS_5 ASM_ARGS_4, "r" (_v1)
- #define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \
- ({ \
- register int _a1 asm("r0"), _nr asm("r7"); \
- LOAD_ARGS_5 (args) \
- _nr = name; \
- asm volatile ("swi 0x0" \
- : "=r" (_a1) \
- : "r" (_nr) ASM_ARGS_##nr \
- : "memory" \
- ); \
- _a1; \
- })
- void test(void)
- {
- INTERNAL_SYSCALL_RAW(, , , , , , , );
- }
预处理后即为:
- void test(void)
- {
- ({
- register int _a1 asm("r0"), _nr asm("r7");
- int _v1tmp = (int)();
- int _a4tmp = (int) ();
- int _a3tmp = (int)();
- int _a2tmp = (int)();
- int _a1tmp = (int)();
- _a1 = _a1tmp;
- register int _a2 asm ("a2") = _a2tmp;
- register int _a3 asm ("a3") = _a3tmp;
- register int _a4 asm ("a4") = _a4tmp;
- register int _v1 asm ("v1") = _v1tmp;
- _nr = ;
- asm volatile (
- "swi 0x0"
- : "=r" (_a1)
- : "r" (_nr) , "r" (_a1), "r" (_a2),
"r" (_a3), "r" (_a4), "r" (_v1)- : "memory"
- );
- _a1;
- });
- }
相应的汇编代码:
- test:
- stmfd sp!, {r4, r7, fp}
- add fp, sp, #
- sub sp, sp, #
- mov r3, #
- str r3, [fp, #-]
- mov r3, #
- str r3, [fp, #-]
- mov r3, #
- str r3, [fp, #-]
- mov r3, #
- str r3, [fp, #-]
- mov r3, #
- str r3, [fp, #-]
- ldr r0, [fp, #-]
- ldr r1, [fp, #-]
- ldr r2, [fp, #-]
- ldr r3, [fp, #-]
- ldr r4, [fp, #-]
- mov r7, #
- #APP
- @ "go.c"
- swi 0x0
- @ ""
- sub sp, fp, #
- ldmfd sp!, {r4, r7, fp}
- bx lr
glibc中fork系统调用传参的更多相关文章
- 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程
GDB的那些奇淫技巧 evilpan 收录于 Security 2020-09-13 约 5433 字 预计阅读 11 分钟 709 次阅读 gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...
- 在ListBoxItem的样式中的button传参,把当前选中项传递到命令的方法
原文:在ListBoxItem的样式中的button传参,把当前选中项传递到命令的方法 前端页面: <Style x:Key="ThumbItemStyle" TargetT ...
- Angular 项目开发中父子组件传参
在项目开发中经常会遇到 组件之间传参的问题.今天总结下在使用angular的项目中父子组件传参的问题: 1.父组件向子组件传参: 然后在父组件中 然后在父组件的html中 然后就可以在子组件中使用了 ...
- jq中的ajax传参
一. jq中的Ajax传参有两种 1.通过url地址来传参 2.通过data来传递参数 1. url来传递参数 function GetQuery(id) { | ...
- Python中的引用传参
Python中函数参数是引用传递(注意不是值传递).对于不可变类型,因变量不能修改,所以运算不会影响到变量自身:而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量. 引用传参一: >& ...
- JS中onclick事件传参
美术馆案例中,需要将“增加一个img标签,放入大图片”这样一个函数封装,但是在调用的时候需要传参. <script type="text/javascript"> on ...
- springMVC中controller的传参的几种案例
1.springmvc的controller方法不指定method时,默认get/post都支持 //@RequestMapping(value="test") //@Reques ...
- python中给函数传参是传值还是传引用
首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...
- vue中的路由传参及跨组件传参
路由跳转 this.$router.push('/course'); this.$router.push({name: course}); this.$router.go(-1); this.$r ...
随机推荐
- 解决hibernate向mysql插入中文乱码问题(转)
转载自:http://blog.csdn.net/peditable/article/details/7047573 1.首先需要修改MySQL数据库的配置文件my.ini,此文件放在mysql根目录 ...
- [转]Oracle 树操作(select…start with…connect by…prior)
原文地址:https://www.cnblogs.com/colder/p/4838574.html oracle树查询的最重要的就是select…start with…connect by…prio ...
- Android Things专题5 I2C
文| 谷歌开发人员技术专家, 物联网方向 (IOT GDE) 王玉成(York Wang) 上一讲中.我们说到 Android Things 的 API,以及 Peripheral I/O 设备包括的 ...
- 最美应用API接口分析
最美应用API接口分析html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMirror-scr ...
- WPF重写Button样式
首先指定OverridesDefaultStyle属性为True: 然后添加样式: 重写ControlTemplate: <Window.Resources> <Style x:Ke ...
- [转]Java中的POJO类
简单的Java对象(Plain Old Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter se ...
- MacBook如何用Parallels Desktop安装windows7/8
虽然MacBook真的很好用,不过在天朝的国情下,有很多软件还是仅支持IE和windows系统下才有.所以有必要为自己的MacBook装一个windows版本的系统,之前试过用Boot Camp来建立 ...
- Knockout开发中文API系列4–监控属性数组
PS:这个翻译系列好久都没有更新了,实在是不应该,一方面是由于时间不多,另一方面也由于自身惰性太大,从今天起接着更新,会在最近的一月内把这个系列中文API文档翻译完整. 如果你想侦测并响应一个对象的变 ...
- 【转】.Net 架构图
- SpringBoot 中 @RequestBody的正确使用方法
SpringBoot 中 @RequestBody的正确使用方法 最近在接收一个要离职同事的工作,接手的项目是用SpringBoot搭建的,其中看到了这样的写法: @RequestMapping(&q ...