在系统调用中是否保存了硬件和软件上下文?

In a system call are hardware and software context saved?

谁来保存系统调用例程之前的硬件和软件上下文?是处理器本身还是软件处理程序?

谢谢。

通常,事情的工作方式是每个系统服务都有一个包装函数。该包装器在使用系统的正常调用约定时采用参数。该包装器解压参数并设置寄存器。然后触发异常进入内核态。

系统服务的内核模式异常处理程序必须保存它修改的寄存器(超出用于 return 值的寄存器)并在退出时恢复它们。

包装函数采用系统服务在寄存器中编辑的任何值 return,并使用普通函数调用约定将它们放入参数中。

如前所述,每个系统调用都有一个包装函数,每个包装函数触发中断128,int 0x80,自动将寄存器eip、esp、cs、ss、eflags保存在内核堆栈中。 在处理函数中,一个 SAVE_ALL 宏被调用,它将把其余的寄存器压入堆栈,当系统调用被服务时,值被弹出以恢复以前的状态。调用 iret 命令,CPU 弹出它之前保存的 5 个寄存器。