关于系统调用参数传递的问题
最近看源码发现所有的系统调用的定义都使用asmlinkage来修饰,如:asmlinkage long sys_time(time_t __user *tloc);网上查asmlinkage,说是asmlinkage作用就是告诉编译器,函数参数不是用用寄存器来传递,而是用堆栈来传递的。我的疑惑是系统调用不是切换堆栈吗?而用户栈与内核栈在不同的地址空间,那么怎么通过堆栈来传递参数?因为刚看内核方面的书籍,所以可能问的问题很傻,但还是希望大家能够详细的说明一下,谢谢了!!! 好吧,这个问题搞清楚了,在系统调用时,函数参数确实是通过寄存器传递的,不过在进入int 0x80中断处理程序(即system_call)中,会使用SAVE_ALL将eax、ebx...这些寄存器压入内核栈中,然后根据系统调用号执行相应的系统调用函数,如asmlinkage long sys_time(time_t __user *tloc),因为asmlinkage这个宏,所以该函数只从内核栈上获取参数。 是的x86上系统调用就是 0x80 号中断.arm : http://blog.chinaunix.net/uid-28236237-id-3404140.html
页:
[1]