2012-07-20 30 views
2

从罗伯特·爱的书,(在系统调用实现)参数传递的系统调用在Linux

不知何故,用户空间必须在陷阱中中继参数给内核。最简单的方法是通过传递系统调用号的相同方式: 参数存储在寄存器中。在x86-32上,寄存器ebx,ecx,edx,esi和edi包含前五个参数。在不太可能的情况下,有六个或更多个参数,单个寄存器用于保存指向用户空间,其中存储了所有参数 。

asymlinkage前缀为每一个系统调用将期望参数是在系统堆栈。并且当模式切换发生时参数如何复制到内核堆栈中?

+0

http://stackoverflow.com/questions/10061324/how-to-write-ac-function-invoked-from-assembly-code/10063777# 10063777 – 2012-07-24 04:04:08

+0

http://stackoverflow.com/questions/9238109/where-is-the-linux-isr-entry-point/9261572#9261572 – 2012-07-24 04:14:10

回答

3

通过系统调用粘合逻辑将参数放置到堆栈上。所有的系统调用都是通过一个中断陷阱来完成的(我相信x86上的int 0x80)。这个中断处理程序的内核代码完成了将参数放入系统调用处理程序的堆栈所需的工作。

看看这个常见问题回答非常问题:http://kernelnewbies.org/FAQ/asmlinkage

+0

“系统调用胶合逻辑” - > tatz正是我的问题。你能指出内核中的代码是否符合这个逻辑? – viji 2012-07-20 13:46:41

+0

这可以在http://fxr.watson.org/fxr/source/arch/x86/kernel/entry_32.S?v=linux-2.6 – chmeee 2012-07-20 13:54:30

+0

中找到请注意,在x86-32上,您有两种有效的系统调用方式: 'int 0x80'和'sysenter'。在x86-64上可能有四种方法:int 0x80,sysenter,syscall32和syscall。 – 2012-07-24 04:06:36