2012-07-08 70 views
0

进行系统调用时,使用代码段寄存器或控制寄存器进行预取级别检查吗?代码段寄存器在系统调用中的作用

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

如果有人解释了在系统调用关于级别变化时发生在cpu中的情况,会有很大的帮助。

回答

0

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

AMD和英特尔提出了optimized instructions以使此过程更快,这是此平台上所有操作系统都使用的实际情况。

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

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

通过中断表中引用的权限级别获得,不检查,从代码段 - 或,在优化的情况下,作为预加载到MSR(一个CPU寄存器不非内核代码可访问)。

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

+0

我在linux的同一进程地址空间里有一个double.is内核模式,它使用系统调用进入内核模式,或者内核代码是完全不同的进程? – Dhatri 2012-07-09 18:06:38

+0

@vindhya - 进程和地址空间是不同的东西。地址空间主要由CPU提供。进程由操作系统提供;每个进程由地址空间,内核模式堆栈空间,打开文件表等组成。两个进程的地址空间完全重叠(如果它们只是您称之为“相同进程”的线程),或者部分地与所有内核内存映射到相同的地址,但不能从用户模式访问。系统调用不会更改进程,并且不会更改地址空间。 – 2012-07-09 20:21:53

相关问题