为什么在xv6中有sizeof(gdt)-1的gdtdesc

bootasm.S

.p2align 2                                # force 4 byte alignment
gdt:
  SEG_NULLASM                             # null seg
  SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff)   # code seg
  SEG_ASM(STA_W, 0x0, 0xffffffff)         # data seg

gdtdesc:
  .word   (gdtdesc - gdt - 1)             # sizeof(gdt) - 1
  .long   gdt                             # address gdt

这用于

lgdt gdtdesc

gdtdesc 的第一个字不应该是 gdt 的字节大小吗?在这种情况下,它是3*8=24,它等于gdtdesc - gdt。为什么gdtdesc - gdt - 1在这里?

回答

根据手册,lgdt想要以字节为单位的 GDT 大小,但也将其描述为“限制”。该措辞在最后一个字节的大小与地址之间存在歧义。(这是一种允许更高限制而不包含 16 位限制的方法。)

但是https://wiki.osdev.org/GDT_Tutorial 中的示例使用 sizeof(gdt) 所以这要么是 xv6 中的错误,要么是 osdev 教程中的错误。

https://wiki.osdev.org/Global_Descriptor_Table同意 xv6,说“限制”是大小 1,与 GDT 教程不同。这是有道理的:

size是由1减去表的大小 。这是因为大小的最大值是65535,而GDT可高达65536个字节(最高8192个条目)。此外,任何 GDT 的大小都不能为 0。

如果要确认详细信息,请查看 Intel 或 AMD 的手册;他们希望在系统开发细节的某个地方澄清这一点,与lgdt.

或者你希望他们会。但不幸的是,英特尔说:

第 2.4.1 节全局描述符表寄存器(GDTR)

“表限制指定表中的字节数”。

这可能只是意味着无论写它的人是谁都被限制 = 最后一个字节的偏移量 = 大小的想法所困扰,以至于他们甚至没有意识到这一点还不清楚。段限制本身(在 GDT 条目中)也以这种方式工作,使用0xFFFFF(粒度=页面)将限制指定为 4GiB 地址空间的最顶部,即无限制。


以上是为什么在xv6中有sizeof(gdt)-1的gdtdesc的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>