【发布时间】:2014-10-15 21:53:55
【问题描述】:
我对系统调用感到困惑。在 X86 中,System Call 使用 eax 将系统调用号传递给内核。
但是它使用什么将参数传递给内核,在某些地方我看到它使用堆栈,在少数地方它说它使用 EBX、ECX 等寄存器。
那么有人可以确认哪个是正确的吗?
前参考: 这个link 说它使用堆栈。
这个link 说它使用寄存器。
【问题讨论】:
标签: linux-kernel kernel system-calls
我对系统调用感到困惑。在 X86 中,System Call 使用 eax 将系统调用号传递给内核。
但是它使用什么将参数传递给内核,在某些地方我看到它使用堆栈,在少数地方它说它使用 EBX、ECX 等寄存器。
那么有人可以确认哪个是正确的吗?
前参考: 这个link 说它使用堆栈。
这个link 说它使用寄存器。
【问题讨论】:
标签: linux-kernel kernel system-calls
两个链接都是正确的。
您可以在 中看到,所有系统调用都以 asmlinkage 前缀声明。事实上,当您使用 SYSCALL_DEFINEx 宏定义系统调用时,它会使用 asmlinkage 指令定义您的系统调用函数。 asmlinkage 指令指示编译器该函数不应期望来自 CPU 寄存器的任何参数,即所有参数应仅从堆栈访问。
从用户空间调用时,每个参数都被推送到CPU寄存器,在用户到内核的转换过程中,内核在处理系统调用时需要将所有寄存器保存到堆栈中(以便在返回用户空间之前恢复环境)来自用户空间的请求,因此之后参数在堆栈上可用于内核空间系统调用函数。
【讨论】:
两个链接都告诉我们参数是从用户空间通过 EBX、ECX 等寄存器传递到内核空间的。
在第一个参考页面:35/352,System Call Implementation/wrappers task第1点,给出
用户堆栈中可用的参数被移动到处理器寄存器,然后这些寄存器用于将系统调用的参数传递给内核空间。
我想你在第一个参考的系统调用实现页面上看到堆栈这个词后一定会感到困惑。
【讨论】: