X86 cs寄存器如何在保护模式下工作?

X86 cs寄存器如何在保护模式下工作?,x86,operating-system,protected-mode,X86,Operating System,Protected Mode,这是段寄存器的内容,由13位偏移量、1位表指示符和2位请求的特权级别组成: Bit: | 15 3 | 2 | 1 0 | Content: | offset (index) | ti | rpl | 这是用于初始化ds寄存器的代码段: .set PROT_MODE_DSEG, 0x10 movw $PROT_MODE_DSEG, %ax movw %ax, %ds 这是中断描

这是段寄存器的内容,由13位偏移量、1位表指示符和2位请求的特权级别组成:

Bit:     | 15                                3 | 2  | 1 0 |
Content: | offset (index)                      | ti | rpl |
这是用于初始化
ds
寄存器的代码段:

.set PROT_MODE_DSEG,  0x10
movw $PROT_MODE_DSEG, %ax
movw %ax, %ds
这是中断描述符表(IDT)中条目的最低32位:

我的问题是:

  • 当我们像上面那样设置
    ds
    时,我们只在
    ds
    寄存器中设置13位偏移量?如果是这样,计算机对其他3位(ti和rpl)做了什么
  • 为什么IDT中的段选择器是16位?据我所知,这个段选择器被用作GDT的索引。它不应该是像ds中的偏移量那样的13位吗
  • 不,它设置完整的16位

  • 完整的16位加载到CS中。RPL在权限中使用 检查。中断处理程序的代码段描述符可以是 驻留在GDT或LDT中


  • 但16位段寄存器中只有13位偏移。如何设置16位加13位的偏移量?例如,在第二个图中,我将
    ds
    寄存器设置为0x10。0x10是第三个描述符的偏移量。从第一张图来看,偏移量只有13位。这是否意味着0x10存储在
    ds
    寄存器的13位中?否,0x10是要加载到ds中的完整16位值。RPL是0,TI是0。你是说第一张图中显示的结构是错误的吗?@MichaelPetch我知道了。因为GDT中的条目都是8个字节,所以它们的偏移量类似于0x8、0x10等,这意味着它们的偏移量的最低三位总是000,并且不必占用存储空间。当我们设置一个段寄存器时,我们只需要最高的13位来存储值。当使用段寄存器索引GDT时,我们将最高的13位乘以8,或者用您的话“将较低的3位置零”。我说得对吗?
    Bit:     | 31              16 | 15              0 |
    Content: | segment selector   | offset low        |