GDT(全局描述符表,Global Descriptor Table)是 x86 保护模式下用于描述不同类型内存段的一个重要数据结构。在保护模式下,GDT 用于管理和保护系统内存,它通过提供一组段描述符来定义内存的访问权限、大小、类型等属性
GDT 表的结构
图中展示的是一个 GDT 的部分内容,包含多个描述符。每个描述符表示内存段,具体内容包括了以下几个部分:
-
任务状态段(TSS,Task State Segment):
- GDT 中的 Task0 TSS 和 Task1 TSS 描述符是与任务切换相关的。TSS 用于存储任务的状态信息,像寄存器的值、堆栈指针等,用于在任务切换时保存和恢复任务的状态。
-
局部描述符表(LDT,Local Descriptor Table):
- Task0 LDT 和 Task1 LDT 分别是两个任务的局部描述符表。LDT 用于为每个任务提供一个局部的段描述符集合,每个任务有自己独立的 LDT。每个 LDT 中可以包含任务相关的代码段、数据段等。
-
系统调用门(系统调用门描述符):
- 这是一个特殊的描述符,用于实现系统调用,允许用户级程序请求内核服务。图中标注为“系统调用门”。
-
应用程序数据段和代码段:
- 应用数据段 和 应用代码段 描述符用于普通应用程序的内存区域,其中的数据段存储数据,代码段存储程序指令。
-
内核数据段和代码段:
- 内核数据段 和 内核代码段 描述符定义内核空间的内存区域,内核代码段存放内核指令,内核数据段存放内核数据。
-
DPL(Descriptor Privilege Level,描述符特权级):
- DPL 表示该段的访问级别,取值范围为 0 到 3:
- DPL=0 表示内核模式(特权级 0),最高权限。
- DPL=3 表示用户模式(特权级 3),最低权限。
- 对应的段可能只允许某些特权级的代码访问。例如,内核代码只能由 DPL=0 的代码访问,而应用程序只能访问 DPL=3 的数据段。
- DPL 表示该段的访问级别,取值范围为 0 到 3:
GDT 表的作用
- 内存段描述:GDT 通过描述符提供对内存段的访问控制,保证不同程序的内存空间互不干扰,增加系统的安全性。
- 特权级管理:通过设置不同的特权级,保护模式确保内核代码和用户代码分离,避免普通程序对内核的非法访问。
- 任务切换:TSS 和 LDT 在任务切换过程中发挥作用,GDT 允许操作系统在多个任务之间切换时,自动保存和恢复任务的状态。