在我见过的许多教程中,第一个段选择器仅包含零,后面是代码和数据段,例如:
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(使用前将#替换为@)