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 ...
随机推荐
- JAVA-JSP内置对象之request范围
相关资料:<21天学通Java Web开发> request范围1.在一次请求内有效.2.如果页面从一个页面跳转到另一个页面,那么属性就失效了.3.如果使用服务器端跳转<jsp:fo ...
- C#学习笔记(14)——C# 使用IComparer自定义List类的排序方案
说明(2017-7-17 21:34:59): 原文:https://my.oschina.net/Tsybius2014/blog/298702?p=1 另一篇比较好的:https://wenku. ...
- 基于css3 transform实现散乱的照片排列
分享一款基于css3 transform实现散乱的照片排列.这是一款简单零散的css3相册排列特效下载.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class= ...
- 如何通过Dreamweaver批量对整个站点或目录进行代码搜索或部分全部替换
原文地址:http://www.idc523.com/faq/view-331.html 如何通过Dreamweaver批量对整个站点或目录进行代码搜索或部分全部替换 有的时候,我们希望修改网站代码或 ...
- python 全局变量的使用
我尝试使用 类似 C 语言的方式去调用 python 的全局变量,发现不行,后经过 尝试,要使用 global 进行调用 test_num = 0; # 首先声明一个全局变量 def test_fun ...
- linux文件系统比较
Linux上有许多可用的文件系统.每个文件系统都有其特定的用途,以便于特定用户解决不同的问题.本文的焦点集中在Linux平台上文件系统的主流选择.毫无疑问,其它的场景下还有一些别的选择. 文件系统:它 ...
- python 核心编程 01
特殊变量 python用下划线作为变量的前缀和后缀指定特殊变量._XXX : 不用 'from module import *' 导入, 可以认为是模块中的私有变量__XXX__ : 系统定义的名字_ ...
- js关于弹也遮罩层
1:什么是遮罩层 遮罩层:我是弹也一个(遮罩层)还有一个(内容层),下面上图片看一效果 我们看到一个灰蒙蒙的遮盖(其实也是一个层)还有一个层(也就是我们展示的内容). 2: 弹出层效果居中分析 在这 ...
- r语言 工作空间内的对象
objects.size() objects() 脚本举例 #将以下代码粘贴到编辑器中,另存为regression.r文件. rate<-c(20, 22, 24, 26, 28, 30, 32 ...
- vb 三种启动模式
正常启动不用说了 就是虚拟机和显示部分在同一个程序里进行 直接关闭程序 就都关闭了 相当于我们普通的电脑, 有主机和显示器无界面启动 也很好理解 ,就是在后台启动虚拟机,如同服务器, 我们只有一个主机 ...