【问题标题】:Why have the first segment descriptor of the global descriptor table contain only zeroes?为什么全局描述符表的第一个段描述符只包含零?
【发布时间】:2015-10-18 13:10:39
【问题描述】:

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

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 段描述符的用途是什么?

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

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

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

    所以这似乎意味着它无法正确使用,因此您可以随意使用它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 2016-09-29
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多