LDT 和 LDTR

📅 2026/8/20 3:53:31
LDT 和 LDTR
为什么需要 LDTGDT 是全局的所有任务进程共享。但每个任务可能需要自己私有的段比如任务私有的代码段、数据段。如果全部放在 GDT 中随着任务增多GDT 会变得非常庞大且管理混乱。LDTLocal Descriptor Table局部描述符表就是为了解决这个问题每个任务可以拥有自己的 LDT用于存放该任务私有的段描述符。LDTR 寄存器LDTRLDT Register和 GDTR 类似但指向的是当前任务的 LDT。寄存器指向的表作用范围GDTRGDT全局描述符表全局共享LDTRLDT局部描述符表每个任务私有LDTR 存储的内容与 GDTR 类似基地址Base当前 LDT 在内存中的线性地址。界限LimitLDT 的大小。此外LDTR 还有一个可见部分段选择子和不可见部分描述符缓存。如何加载 LDTR使用lldt指令加载 LDT 的段选择子; 假设 GDT 中有一个描述符指向 LDT其选择子为 0x20 lldt ax ; ax 0x20加载 LDT 选择子到 LDTR执行lldt后CPU 会使用选择子0x20在 GDT 中索引找到对应的LDT 描述符。从该描述符中读取 LDT 的基地址和界限。将基地址和界限加载到 LDTR 的不可见缓存部分。段选择子中的 TI 位回顾之前提到的段选择子结构------------------- | 索引 | TI | RPL | | (13位)| (1位)| (2位) | -------------------TI 0在GDT中查找描述符。TI 1在LDT中查找描述符。当TI 1时CPU 会使用LDTR中的基地址 索引 × 8 来定位 LDT 中的描述符。任务切换与 LDT在任务切换时通过CALL或JMP到任务门或使用IRET返回CPU 会自动加载新任务的TSS任务状态段TSS 中包含该任务的 LDTR 选择子。因此每个任务可以拥有独立的 LDT实现地址空间的隔离。GDT vs LDT 对比特性GDTLDT作用范围全局所有任务共享局部每个任务私有寄存器GDTRLDTR加载指令lgdtlldt段选择子 TI 位01第一个描述符空描述符必须空描述符可选但通常也有现代操作系统使用广泛使用x86-64 仍需基本弃用Linux/Windows 不用现代操作系统Linux、Windows在实践中基本不使用 LDT。它们通过分页机制来实现进程隔离分段机制被简化基址设为 0段界限设为 4GBLDT 几乎无用武之地。