跳转到内容

x86 汇编/全局描述符表

来自 Wikibooks,开放书籍,开放世界

全局描述符表 (GDT) 是内存中定义处理器内存段的表格。GDT 设置段寄存器的行为,并有助于确保保护模式顺利运行。

GDT 由 x86 芯片中的一个特殊寄存器指向,即 GDT 寄存器,简称为 GDTR。GDTR 长度为 48 位。低 16 位指示 GDT 的大小,而高 32 位指示 GDT 在内存中的位置。以下是 GDTR 的布局

|LIMIT|----BASE----|

LIMIT 是 GDT 的大小,而 BASE 是起始地址。LIMIT 比表格长度小 1,因此如果 LIMIT 的值为 15,则 GDT 长度为 16 字节。

要加载 GDTR,使用 LGDT 指令

lgdt [gdtr]

其中 gdtr 是指向包含所需 GDTR 值的 6 字节内存的指针。请注意,要完成加载新 GDT 的过程,需要重新加载段寄存器。必须使用远跳转来加载 CS 寄存器

flush_gdt:
    lgdt [gdtr]
    jmp 0x08:complete_flush
 
complete_flush:
    mov ax, 0x10
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax
    ret

GDT 表包含许多称为 段描述符 的条目。每个条目长度为 8 字节,包含有关段的起始点、段的长度和段的访问权限的信息。

以下 NASM 语法代码表示单个 GDT 条目

struc gdt_entry_struct

	limit_low:   resb 2
	base_low:    resb 2
	base_middle: resb 1
	access:      resb 1
	granularity: resb 1
	base_high:   resb 1

endstruc

每个独立程序将从操作系统接收多个用于的不同的内存段。每个本地内存段的特性都存储在一个称为 本地描述符表 (LDT) 的数据结构中。GDT 包含指向每个 LDT 的指针。

华夏公益教科书