2

来自 Robert Love 的书,(在系统调用实现中)

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

但是asymlinkage为每个系统调用加上前缀,这些系统调用期望参数位于系统堆栈中。还有当模式切换发生时,如何将参数复制到内核堆栈中?

4

1 回答 1

3

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

查看此常见问题解答以回答这个问题: http: //kernelnewbies.org/FAQ/asmlinkage

于 2012-07-20T13:39:46.327 回答