我知道,当我们想要进行系统调用时,我们通常会围绕该系统调用调用一个 C 包装器,该包装器在内部将参数放在正确的位置(有时在特定的寄存器或堆栈中)。
在放入参数(并忽略诸如 syscall 指令之类的方法,因为它并非在所有平台上都可用)后,包装器通常会执行 int 0x80(软件中断)。
现在,当遇到中断时,硬件会将正在运行的进程的所有寄存器保存在其堆栈中并进行上下文切换(包括切换程序计数器和堆栈指针等)。
我无法理解系统调用处理程序如何访问最初由 C 包装器在特定寄存器中设置的参数,而这些参数现在驻留在用户进程堆栈中(不是 > 在内核进程堆栈中)
答案 0 :(得分:2)
现在,当遇到中断时,硬件会将正在运行的进程的所有寄存器保存在其堆栈中并进行上下文切换(包括切换程序计数器和堆栈指针等)。
不;-) 在 Linux AMD64 上,系统调用参数直接在寄存器中传递(寄存器不会堆叠)。
有关详细信息,请参阅“x86-64 Linux 系统调用约定”http://refspecs.linuxfoundation.org/elf/x86_64-abi-0.99.pdf 节。第 123 页底部/页首的“A.2.1 调用约定”。 124.