【问题标题】:In a system call are hardware and software context saved?在系统调用中是否保存了硬件和软件上下文?
【发布时间】:2018-04-22 15:30:42
【问题描述】:

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

谢谢。

【问题讨论】:

  • 在系统调用之前没有保存上下文。
  • 但是硬件上下文保存在内核堆栈中不是吗? @user3344003
  • 你的意思是寄存器和地址吗?在 x86 上两者兼而有之,但主要是软件
  • Yes(x86) 我的意思是像 %ebx、%edx 等寄存器以及硬件寄存器 @thatotherguy

标签: linux unix operating-system call


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    包装函数接受系统服务在寄存器中返回的任何值,并使用正常的函数调用约定将它们放入参数中。

    【讨论】:

    • 你说得对。我做了一些研究,我会在这里问我的问题:1- CPU 寄存器(eip,cs,psw,esp,ss)由处理器自动保存。 2-通用寄存器由处理程序手动保存。
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多