x86 汇编/全局描述符表
外观
< X86 汇编
全局描述符表 (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 的指针。