全局描述符表GDT (Global Descriptor Table)

全局描述符表(Global Descriptor Table, GDT)是x86架构计算机系统中的一个重要的数据结构,它在保护模式下发挥作用,用于描述内存段的特性和属性。GDT通过提供一种机制来管理内存访问权限和段的大小,增强了操作系统的内存管理和程序的安全性。

GDT的基本结构

GDT是一个存放在内存中的数据结构,由一系列的描述符(Descriptor)组成,每个描述符占8个字节(64位),用来描述一个内存段的起始地址、大小以及访问权限等信息。GDT至少包含三个基本段描述符:代码段描述符、数据段描述符和一个空描述符,但根据需要可以包含更多描述符。

每个段描述符主要包含以下关键信息:

  • 基地址(Base Address):指明段的起始物理地址。
  • 限长(Limit):定义了段的最大长度。
  • 访问权限(Access Rights):控制段的访问权限,包括是否可读、可写、可执行以及不同级别的特权级(Ring 0到Ring 3)等。

GDT的作用

  1. 内存保护:通过设置访问权限,GDT可以防止程序访问不属于它的内存区域或以错误的方式(如尝试写入只读段)访问内存,从而提高了系统的稳定性与安全性。
  2. 特权级别管理:操作系统可以根据不同的任务或程序赋予不同的特权级别,限制低级别程序对某些敏感资源的访问,比如硬件直接访问或修改内核数据。
  3. 段管理:允许程序使用更大的地址空间或多个独立的地址空间,每个段可以有不同的属性,便于管理和优化内存使用。

实现机制

在x86架构中,CPU通过GDTR(Global Descriptor Table Register)寄存器来访问GDT。GDTR寄存器存储了GDT的基地址和限长。当处理器需要访问某个内存段时,会根据当前段选择子(Segment Selector,一个16位的值,在段寄存器中存放)从GDT中查找对应的段描述符,然后根据描述符的内容设置段的访问权限和地址翻译参数。

设置和使用GDT

在操作系统初始化时,会构建GDT并加载到内存中,然后通过LGDT指令(Load Global Descriptor Table)将GDT的地址和大小载入GDTR寄存器。之后,通过段选择子和段寄存器的组合,程序可以在保护模式下访问内存。

总的来说,全局描述符表是x86架构保护模式下内存管理和权限控制的关键组件,对于现代操作系统的稳定运行和安全性至关重要。

GDT 与 LDT

GDT是全局描述符表。LDT为局部描述符表,但Windows并没有使用它,故不再介绍,感兴趣请查询Intel白皮书。当我们执行类似MOV DS,AX指令时,CPU会查表,根据AX的值来决定查找GDT还是LDT,并找到对应的段描述符。段描述符将会在后面部分进行介绍。

GDT表存在于内存之中。CPU要想找到它,就必须知道它的位置。于是乎CPU有一个寄存器。它被称之为GDTR,存储了GDT表的位置和大小,是一个48位的寄存器,用C语言表示如下:

复制代码
struct GDTR
{
    DWORD GDTBase;    //GDT表的地址
    SHORT limit;      //GDT表的大小
}

我们如何通过WinDbg来获取GDT的地址、大小和GDT表里的成员呢?首先提一句,段描述符大小为64位。有关其操作见下图:

r指令为查看寄存器

r gdtr指令表示读取GDT表的地址;

r gdtl指令表示读取GDT表的大小;

dq 8003f000 l20指令表示从0x8003f000地址(即为GDT表的地址)读取0x20个64位数据,如果没有l20,默认0x10个。

这些都是以后常用的指令,需要熟练掌握。

相关推荐
阿米亚波1 天前
【C++ STL】std::unordered_multiset
开发语言·数据结构·c++·笔记·stl
随意起个昵称1 天前
贪心模型-Johnson法则
c++·算法
蜡笔小马1 天前
【保姆级教程】Windows 下 CGAL 6.2 + VS2022 全流程实战:从源码编译到项目集成(附避坑指南)
c++·cgal
xiaoye-duck1 天前
《Linux系统编程》Linux 系统多线程(八): C++ 高并发线程池全链路深度解析与从零手撕实现
linux·c++·线程池
胖大和尚1 天前
在C++的类中,是否可以把函数声明成__device__
c++·cuda
十年磨剑走天涯1 天前
C++ STL 容器操作复杂度速查表
开发语言·c++
ziguo11221 天前
Windows API MessageBox 函数详解
c语言·c++·windows·visualstudio
王老师青少年编程1 天前
2023年CSP-J初赛真题及答案解析(11-15)
c++·真题·csp-j·答案·csp·初赛·信奥赛
15Moonlight1 天前
C++进阶(09):特殊类设计
开发语言·c++
皓月斯语1 天前
B3867 [GESP202309 三级] 小杨的储蓄 题解
c++·算法·题解