0

进行系统调用时,是否使用代码段寄存器或控制寄存器检查特权级别?

intel cpus 中的代码段寄存器用于分段目的。我不清楚 linux 中如何处理分页和 intel x86 机制。

如果有人解释了在进行系统调用以更改级别时cpu中发生的情况,那将是非常有帮助的。

4

1 回答 1

0

Linux 从未使用 286 样式分段来分隔进程,或者以其他方式使虚拟内存有趣地分段,而是从一开始就使用 386 样式分页。转移到内核态(syscall)曾经是一条简单的int指令,根据中断表转移执行,使CPU进入内核态(保护级别0)。然而,CPU 仍然必须重新加载段描述符以“了解”新的保护级别以及新段的位置(尽管它始终是 CPU 只是“不知道”的同一个虚拟内核模式段。)。

AMD 和 Intel 提出了优化指令,以使这个过程更快,这就是这个平台上所有操作系统在现实中使用的。

然后内核代码必须做更多的工作来将寄存器保存在堆栈上并将它们初始化为新值,而这并没有改变。但这通常不被理解为系统调用过程的一部分。

进行系统调用时,是否使用代码段寄存器或控制寄存器检查特权级别?

特权级别是从通过中断表引用的新代码段获得的,而不是检查的,或者在优化的情况下,是预加载到 MSR(非内核代码无法访问的 CPU 寄存器)中的。

另一种说法是,切换到级别 0 会在 CPU 级别自动发生,但是段描述符和/或 MSR 需要由内核预先安排,从而真正导致内核执行陷阱处理程序,而不仅仅是一个一般性保护错误。

于 2012-07-08T21:28:14.303 回答