为什么全局描述符表的第一个段描述符仅包含零?

2023-12-24

在我见过的许多教程中,第一个段选择器仅包含零,后面是代码和数据段,例如:

lgdt gdt_descriptor
/* More code. */

gdt_start:
gdt_null:
    .long 0x0
    .long 0x0
/* More descriptors. */
gdt_end:
gdt_descriptor:
   .word gdt_end - gdt_start
   .long gdt_start

这样做的第一目的是什么gdt_null段描述符?


Intel 手册 325384-053U 第 3 部分第 3.4.2 段选择器表示,任何尝试通过段寄存器通过第 0 个描述符访问内存都会导致异常:

处理器不使用 GDT 的第一个条目。指向 GDT 的此条目的段选择器(即 也就是说,索引为 0 且 TI 标志设置为 0 的段选择器被用作“空段选择器”。处理器 当段寄存器(CS 或 SS 寄存器除外)加载 null 时,不会生成异常 选择器。但是,当使用持有空选择器的段寄存器来访问时,它确实会生成异常 记忆。空选择器可用于初始化未使用的段寄存器。用空值加载 CS 或 SS 寄存器 段选择器会导致生成一般保护异常 (#GP)。

因此,这似乎意味着无法正确使用它,因此您可以将其用于任何您想要的用途。

然后将其归零只是最简单的事情,但可以使用任何值代替。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么全局描述符表的第一个段描述符仅包含零? 的相关文章

随机推荐