【发布时间】:2020-08-25 01:29:56
【问题描述】:
我试图通过阅读Robert Love's Linux Kernel Development 来了解 Linux 内核的内部结构。
在第 74 页,他说将参数传递给 syscall 的最简单方法是通过:
不知何故,用户空间必须在运行期间将参数传递给内核 陷阱。最简单的方法是通过与系统调用相同的方式 数字被传递:参数存储在寄存器中。在 x86-32 上, 寄存器 ebx、ecx、edx、esi 和 edi 按顺序包含第一个 五个参数。
现在这让我很困扰,原因有很多:
- 所有系统调用都使用
asmlinkage选项定义。这意味着参数是always to be found on the stack and not the register。那么,这些与寄存器有关的业务是什么? - 可能在执行系统调用之前将值复制到内核堆栈。我不知道为什么这样做会很有效,但它可能是一种可能性。
【问题讨论】:
标签: c linux linux-kernel system-calls interrupt