X86系统寄存器介绍(续)——系统地址寄存器

1. GDTR(全局描述符表寄存器)

  • 作用:全局描述符表GDT(Global Descriptor Table)只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDT定义了系统中所有任务共享的内存段属性,如代码段、数据段等。
  • 结构
    • 48位寄存器,高32位为GDT的基地址,低16位为表的大小限制(值为表长度-1)。
    • 例如:LGDT [gdt_ptr]指令加载GDTR,其中gdt_ptr指向一个包含基地址和限制的6字节内存区域。
  • 重要性
    • 在保护模式下,虽然Linux没有使用分段机制管理内存(进行内存分段),但是仍然保留了分段机制(Linux代码段和数据段的基址都相同,相当于所有段都开始于同一虚拟地址,实际上没有分段,靠分页来管理内存),但是,分段机制却用于CPU通过GDT访问内存段,确保内存隔离和权限控制。
    • 系统启动时由操作系统初始化,通常每个处理器核心只有一个GDT。

X86系统寄存器介绍(续)——系统地址寄存器_第1张图片

GDTR提供了GDT的基址,段选择器的偏移部分(3~15位)与GDTR相加,得到段描述符在GDT中的位置。


2. LDTR(局部描述符表寄存器)

  • 作用:指向当前任务的局部描述符表(LDT)。LDT定义了任务私有的内存段,实现多任务隔离。
  • 结构
    • 16位可见部分:存储LDT的段选择子,指向GDT中的LDT描述符。
    • 隐藏部分:缓存LDT描述符的基地址、限制和属性(加载段选择子时自动填充)。
  • 操作
    • 使用LLDT [selector]指令加载段选择子,CPU自动从GDT读取LDT描述符并缓存。
    • 任务切换时,LDTR会被更新以指向新任务的LDT。
  • 应用场景:在需要任务隔离的系统中(如早期Windows NT),LDT用于定义任务私有段,但现代系统通常仅用GDT,不用LDT

3. IDTR(中断描述符表寄存器)

  • 作用:与GDTR的作用类似,IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值。指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。在机器刚加电或处理器复位后,基地址被默认地设置为0,而长度值被设置成0Xffff。IDT定义了中断和异常处理程序的入口。
  • 结构
    • 48位寄存器,高32位为IDT基地址,低16位为表的大小限制(值为表长度-1)。
    • 例如:LIDT [idt_ptr]指令加载IDTR。
  • 重要性
    • 发生中断或异常时,CPU根据中断号索引IDT,跳转到对应的处理程序。
    • 包含三种门描述符:任务门、中断门、陷阱门,控制处理程序的执行环境。

4. TR(任务寄存器)

  • 作用:TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。它引用GDT表中的一个TSS类型的描述符。指向当前任务的TSS(任务状态段),用于任务切换和上下文保存。
  • 结构
    • 16位可见部分:存储TSS的段选择子,指向GDT中的TSS描述符。
    • 隐藏部分:缓存TSS的基地址、限制和属性。
  • 操作
    • 使用LTR [selector]指令加载段选择子,CPU自动从GDT读取TSS描述符并缓存。
    • 指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。当使用LTR指令把选择符加载进任务寄存器时,TSS描述符中的段基地址、段限长度以及描述符属性会被自动加载到任务寄存器中。当执行任务切换时,处理器会把新任务的TSS的段选择符和段描述符自动加载进任务寄存器TR中。
  • TSS内容
    • 通用寄存器、段寄存器、EFLAGS、CR3(页表基址)、特权级堆栈指针等。
    • 现代系统可能仅用TSS存储内核堆栈信息,硬件任务切换较少使用。

对比总结

寄存器

指向的表

结构

加载指令

作用场景

GDTR

GDT

基地址+限制(48位)

LGDT

全局内存段管理

LDTR

LDT

段选择子+缓存

LLDT

任务私有段隔离

IDTR

IDT

基地址+限制(48位)

LIDT

中断/异常处理

TR

TSS

(GDT中的段)

段选择子+缓存

LTR

任务切换和上下文保存


关键注意事项

  1. 缓存机制:LDTR和TR的隐藏部分提高了访问速度,避免每次访问表时查询内存。
  2. 保护模式依赖:这些寄存器在实模式下无意义,仅在保护模式或长模式下生效。
  3. 操作系统角色:由操作系统初始化和管理,用户程序通常无法直接修改。

理解这些寄存器对于分析X86架构的内存管理、多任务调度和中断处理机制至关重要。

你可能感兴趣的:(Linux内核,单片机,嵌入式硬件,Linux内核,X86架构,寄存器)