微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么在 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,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,说“limit”是 size-1,与 GDT 教程不同。这是有道理的:

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

如果要确认详细信息,请查看 Intel 或 AMD 的手册;他们希望在系统开发细节的某处澄清这一点,与 lgdt 的指令集参考条目分开。

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?