【发布时间】:2012-07-08 03:43:04
【问题描述】:
进行系统调用时,是否使用代码段寄存器或控制寄存器检查特权级别?
intel cpus 中的代码段寄存器用于分段目的。我不清楚 linux 中如何处理分页和 intel x86 机制。
如果有人解释了在针对级别更改进行系统调用时cpu中发生的情况,那将是非常有帮助的。
【问题讨论】:
标签: linux
进行系统调用时,是否使用代码段寄存器或控制寄存器检查特权级别?
intel cpus 中的代码段寄存器用于分段目的。我不清楚 linux 中如何处理分页和 intel x86 机制。
如果有人解释了在针对级别更改进行系统调用时cpu中发生的情况,那将是非常有帮助的。
【问题讨论】:
标签: linux
Linux 从未使用 286 样式的分段来分隔进程,或者以其他方式使虚拟内存有趣地分段,而是从一开始就使用 386 样式的分页。转移到内核模式(syscall)曾经是一个简单的int指令,它根据中断表转移执行并导致CPU进入内核模式(保护级别0)。然而,CPU 仍然必须重新加载段描述符以“了解”新的保护级别以及新段的位置(尽管它始终是 CPU 只是“不知道”的同一个虚拟内核模式段。)。
AMD 和 Intel 提出 optimized instructions 来加快这个过程,这也是这个平台上所有操作系统在现实中使用的。
内核代码必须做更多的工作来将寄存器保存在堆栈上并将它们初始化为新值,而这并没有改变。但这通常不被理解为系统调用过程的一部分。
进行系统调用时,是否使用代码检查特权级别 使用段寄存器还是控制寄存器?
特权级别是获得,未检查,从通过中断表引用的新代码段 - 或者,在优化的情况下,预加载到一个 MSR(非内核代码无法访问的 CPU 寄存器)。
另一种说法是,切换到级别 0 会在 CPU 级别自动发生,但段描述符和/或 MSR 需要由内核预先安排,从而真正导致内核执行陷阱处理程序和不仅仅是一般的保护故障。
【讨论】: