gpt4 book ai didi

assembly - 当 x86 机器上触发中断时 CR3 会改变吗?

转载 作者:行者123 更新时间:2023-12-02 19:22:44 25 4
gpt4 key购买 nike

在 x86 机器上,触发中断时 CR3 会改变(不仅仅是 EIP 的值)吗?

最佳答案

发生中断或异常时,处理器会保存以下状态(请参阅Intel 64 和 IA-32 架构软件开发人员手册第 3 卷(3A、3B 和 3C):系统编程指南,6.12。 1.):

  • 如果 DPL(目标特权级别)等于 CPL(当前特权级别),则在将控制权交给中断处理程序之前,以下寄存器和可能的错误代码将被推送到当前堆栈:

    EFLAGS, CS, EIP
  • 如果另一方面,DPL 低于 CPL,则除上述寄存器外,还会寄存器 SS 和 ESP寄存器被压入另一个堆栈(在 TSS 中指定)。

由于处理器必须使操作系统能够恢复被中断进程的状态,因此处理器不可能自行更改除上述寄存器之外的任何其他寄存器。因此CR3没有改变。

这意味着中断处理程序的代码必须可以在可能发生中断的每个虚拟地址空间中访问。因此,并且由于这样的处理程序通常从内核调用额外的代码,因此大多数内核将其自己的代码和数据的很大一部分映射到每个进程的地址空间中,从而减少了每个进程的可用内存空间。通常这种映射建立在可寻址内存空间的“上端”,大约 3GB。

在我很久以前编写的一个业余爱好内核中,我采取了尝试使进程的地址空间尽可能大的方法,因此我只将中断处理程序以及一些代码和所需的数据映射到一个专用内核地址空间在实际处理中断之前进入进程的地址空间。事实证明,这是相当困难的,而且只有一个值得怀疑的好处,这就是为什么我猜大多数系统不采用这种方法。

<小时/>

如果中断描述符表中有一个任务门描述符,那么当该中断触发时,将发生硬件任务切换,将处理器的状态保存到当前的 TSS 中并从任务门引用的 TSS。这包括加载 CR3 寄存器的值,从而更改虚拟地址空间(请参阅上述手册的 7.3.)。

然而,这在实践中很难实现,因为顾名思义,硬件任务切换高度依赖于硬件,因此仅在 x86 CPU 上受支持。由于该功能很少使用,甚至相应的 64 位 CPU 也不再支持它:

In 64-bit mode, task switching is not supported [..]

[Intel manual mentioned above, 7.2.3]

关于assembly - 当 x86 机器上触发中断时 CR3 会改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com