系统调用是如何执行的

系统调用是如何执行的

从应用程序程序员的角度来看,系统调用只是从包装器库调用一个过程。由于我对汇编不太了解,我想知道它在最低级别是如何完成的。应用程序还可以如何在不使用库的情况下调用系统调用?

答案1

系统调用依赖于架构,但它们都具有相似的特征。

在 x86 中,系统调用是通过软件中断或特殊的“systenter”指令完成的。Linux 可以使用其中任何一种,但软件中断最为常见。在启动时,内核会设置中断处理程序,包括硬件产生的中断和软件产生的中断。在 x86 中,有一个特殊的汇编指令“int”,它会产生软件中断。内核已为软件中断 0x80 设置了一个处理程序,作为系统调用中断。

这张表显示了每个可能的系统调用及其参数以及如何传递这些参数。如您所见,eax 寄存器中的数字表示哪个系统调用。其他寄存器指向系统调用的某个参数。

因此,用户空间软件只需在寄存器中设置正确的参数,然后发出中断 0x80。内核设置处理程序来解释系统调用、执行函数,并返回修改寄存器后的任何可能的返回值。

虽然包装函数可以完成所有这些工作,而且通常以可移植的方式进行,但没有理由不能在任何 C/C++ 代码中编写一些内联汇编来直接发出系统调用。您只需要具备汇编的基本知识:将正确的数据移动到正确的寄存器中,然后发出“int 0x80”

相关内容