代码段寄存器在系统调用中的作用

时间:2012-07-08 03:43:04

标签: linux

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

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

如果有人解释了在关于级别变化进行系统调用时cpu中发生了什么,那将会很有帮助。

1 个答案:

答案 0 :(得分:0)

Linux从未使用286样式分段来分离进程,或以其他方式使虚拟内存有趣地分段,而是从一开始就使用386样式分页。转换到内核模式(syscall)曾经是一个简单的int指令,它根据中断表传输执行并导致CPU进入内核模式(保护级别0)。但是,CPU仍然需要重新加载段描述符以“学习”新的保护级别和新段的位置(尽管它总是与CPU“不知道”的虚拟内核模式段相同。)。

AMD和英特尔提出optimized instructions来加快这一过程,这就是该平台上所有操作系统实际使用的方式。

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

  

进行系统调用时,使用代码检查优先级   使用段寄存器还是控制寄存器?

通过中断表引用的 new 代码段中的获取(未检查) - 或者在优化的情况下,作为预先加载的权限级别MSR(非内核代码无法访问的CPU寄存器)。

另一种说法相同的方法是切换到0级会自动在CPU级别上发生,但是段描述符和/或MSR需要由内核预先安排,这样才能真正导致内核执行陷阱处理程序和不只是一般保护错误。

相关问题