5

在x86架构中,有SS、CS、DS、FS、GS等段寄存器。

我知道这些 16 位寄存器指示 LDT、GDT 条目(作为段选择器)和 MMU 引用这个(GDT、LDT)来计算段基数 + 偏移值。并检查权限等。

我很好奇的是:谁根据什么填写段寄存器内容?内核调度程序?

当应用程序更改段寄存器值本身时会发生什么?我知道只有 CS 不能更改,因为它具有当前 CPU 的 CPL。但可以更改其他寄存器(SS,DS ...)。

4

1 回答 1

5

谁根据什么填写段寄存器内容??(内核调度器??)

引导加载程序可以。ISR 和异常处理程序可以。系统调用处理程序可以。调度程序会。其他一些部分可能需要。假定寄存器是私有的,并且必须在各种上下文切换期间保存和恢复。而且,当然,它们也需要在之前的某个时间点进行初始化。

基于需要在这些寄存器中的内容。它们的值在操作系统的不同部分和不同程序之间并不是普遍共享的。

当应用程序更改它自己的段寄存器值时会发生什么?我知道只有 CS 不能更改,因为它具有当前 CPU 的 CPL。但可以更改其他寄存器(SS,DS ...)。

发生什么了?它要么成功更改它,要么导致异常(通常是#GP),然后发生异常处理程序所做的任何事情,或者,如果没有异常处理程序或它有问题,则发生三重故障、CPU 重置,并且可能会重新启动整个计算机。

如果您以某种方式知道可以在当前特权级别上加载哪些其他内容,则可以更改任何段寄存器。如果您的程序处于第 3 级,并且操作系统为其设置了两个 DPL=3 的代码段,则程序可以将其中任何一个用于 CS 寄存器。如果您不知道这一点,则更有可能使程序崩溃。

我想知道 x86 段寄存器的详细信息。

给自己一份副本并阅读:

英特尔® 64 和 IA-32 架构软件开发人员手册组合卷:1、2A、2B、3A 和 3B。

您可以通过相关章节(内存管理、中断/异常处理、任务切换)或搜索特定寄存器(例如 CS 或 SS 或 DS)或查看特定指令的描述和伪代码。

对于这个模糊的问题,你不会得到任何更准确的答案。

于 2013-01-24T01:04:37.960 回答