X86 cs寄存器如何在保护模式下工作?
这是段寄存器的内容,由13位偏移量、1位表指示符和2位请求的特权级别组成: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 这是中断描
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)做了什么但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 |