首页 > 解决方案 > 将参数传递给系统调用

问题描述

我知道当我们想要进行系统调用时,我们通常会围绕该系统调用调用一个 C 包装器,该包装器在内部将参数放在正确的位置(有时在特定的寄存器或堆栈中)。

放置参数后(并忽略系统调用指令等方法,因为它并非在所有平台上都可用),包装器通常执行int 0x80(软件中断)。

现在,当遇到中断时,硬件会将正在运行的进程的所有寄存器保存在其堆栈中并进行上下文切换(这将包括切换程序计数器和堆栈指针等)。

我无法理解系统调用处理程序如何访问最初由 C 包装器在特定寄存器中设置的参数,这些参数现在驻留在用户进程堆栈中(不在内核进程堆栈中)

标签: linuxlinux-kernelsystem-callsinterrupt

解决方案


现在,当遇到中断时,硬件会将正在运行的进程的所有寄存器保存在其堆栈中并进行上下文切换(这将包括切换程序计数器和堆栈指针等)。

不 ;-) 在 Linux AMD64 上,系统调用参数直接在寄存器中传递(寄存器不会堆叠)。

有关详细信息,请参阅“x86-64 Linux 系统调用约定” http://refspecs.linuxfoundation.org/elf/x86_64-abi-0.99.pdf,第 第 123 页底部的“A.2.1 调用约定”/第 1 页页首 124.


推荐阅读