系统调用使用寄存器或堆栈将参数传递给内核?

时间:2014-08-22 05:47:44

标签: linux-kernel kernel system-calls

我对系统调用感到困惑。在X86中,System Call使用eax将系统调用号传递给内核。

但它用什么来将参数传递给内核,在某些地方我看到它使用堆栈,并且在很少的地方它说,它使用EBX,ECX等寄存器。

那么有人可以确认哪一个是正确的吗?

前参考: 这个link说它使用了堆栈。

link表示它使用寄存器。

2 个答案:

答案 0 :(得分:2)

链接都告诉参数通过EBX,ECX等寄存器从用户空间传递到内核空间。

在第一个参考页面中: 35/352 系统调用实施/包装器任务第1点,给出了

  

用户堆栈中可用的参数被移动到处理器寄存器,然后这个寄存器用于将系统调用的参数传递给内核空间。

我认为你必须在第一次参考的系统调用实现页面上看到单词堆栈后感到困惑。

答案 1 :(得分:2)

这两个链接都是正确的。

您可以看到,所有系统调用都使用前缀asmlinkage声明。事实上,当您使用SYSCALL_DEFINEx宏定义系统调用时,它使用asmlinkage指令定义您的系统调用函数。 asmlinkage指令指示编译器该函数不应指望来自CPU寄存器的任何参数,即所有参数都应仅从堆栈访问。

从用户空间调用时,每个参数都被推送到CPU寄存器,在用户到内核转换期间,内核需要在处理系统调用时将所有寄存器保存到堆栈中(以便在返回到用户空间之前恢复环境)来自用户空间的请求,因此在堆栈上可以获得内核空间系统调用函数的参数。