描述
// 全局描述符类型
typedef struct gdt_entry_t {
uint16_t limit_low; // 段界限 15~0
uint16_t base_low; // 段基地址 15~0
uint8_t base_middle; // 段基地址 23~16
uint8_t access; // 段存在位、描述符特权级、描述符类型、描述符子类别
uint8_t granularity; // 其他标志、段界限 19~16
uint8_t base_high; // 段基地址 31~24
} __attribute__((packed)) gdt_entry_t;
// 全局描述符表定义
static gdt_entry_t gdt_entries[GDT_LENGTH] __attribute__ ((aligned(8)));
全局描述符表(Global Descriptor Table,简称 GDT)是 x86 架构中的一种数据结构,用于存储段描述符的信息。在 Intel 平坦模型中,GDT 是用于分段机制的重要组成部分。
GDT 包含了多个段描述符,每个段描述符用于描述一个段的属性和位置。每个段描述符包含以下信息:
1.基址(Base):用于指定段在内存中的起始地址
2.限长(Limit):用于指定段的大小
3.访问权限(Access Rights):用于指定段的访问权限,如读、写、执行等
4.附加属性(Additional Attributes):用于指定一些特殊的段属性,如段的类型、特权级别等
GDT 是一个系统级别的数据结构,每个 CPU 内核都有自己的 GDT。在启动时,操作系统会初始化 GDT,并将其加载到 CPU 的 GDTR 寄存器中。GDTR 寄存器存放 GDT 的起始地址和限长信息,这样 CPU 就能够访问到 GDT 中的段描述符了。
在 x86 架构中,GDT 是用于支持分段机制和虚拟内存的关键数据结构。操作系统通过配置 GDT 中的段描述符,实现虚拟地址到线性地址和线性地址到物理地址的转换。同时,GDT 中的段描述符也定义了每个段的访问权限,从而实现了内存保护和隔离。
需要注意的是,虽然 GDT 是 x86 架构中的一个重要概念,但在现代操作系统中,通常会使用更加灵活和高级的分段机制,如分页机制和多级段描述符表(如在 x86-64 中的 Long Mode 下使用的数据结构:Global Descriptor Table, Local Descriptor Table 和 Interrupt Descriptor Table)。这些机制使得操作系统能够更好地支持虚拟内存、多任务处理和安全性。