一、系统级体系结构概览
系统级体系结构包含了一系列的寄存器、数据结构和支持底层操作的指令。例如内存管理、中断和异常处理、任务管理,以及多处理器控制等。
1.1 全局和局部描述符表
- GDT:Global Descriptor Table,全局描述符表。
- LDT:Local Descriptor Table,局部描述符表。
在保护模式下,所有访存操作均经由 GDT 或 LDT 实现。
GDT 和 LDT 包含了 段描述符,段描述符提供了段的基地址、访问权限、类型、使用信息。
每个段描述符有一个关联的 段选择符,段选择符提供了 GDT 或 LDT 的索引、全局/局部标志(表明是否指向 GDT 或 LDT)、访问权限信息。
获取段中的某个字节需要提供段选择符、偏移地址。
IA-32e 模式下,GDTR 和 LDTR 寄存器被扩展为 64 位。
1.2 门描述符
除了代码段、数据段和堆栈段之外,该架构还定义了两个 系统段:任务状态段(TSS, Task State Segment)和 LDT。由于 GDT 不通过段选择符和段描述符进行访问,因此不认为它是一个段。
三种特殊的描述符,位于 IDT(中断描述符表,Interrupt Descriptor Table)中:
- 中断门:描述中断/异常处理程序的入口点,包含段选择符和中断/异常处理程序的段内偏移量,当控制转移到一个适当的段时,处理器会清除 IF 标志,屏蔽其它中断。
- 任务门:指示任务。当中断信号发生时,任务门内的选择符必须指示 GDT 中的 TSS 描述符,门中的偏移无意义。任务的入口点保存在 TSS 中。利用段间转移指令 JMP 和段间调用指令 CALL,通过任务门可实现任务切换。
- 陷阱门:与中断门相似,只是控制转移时不会修改 IF 标志。
1.3 TSS 和任务门
TSS 定义了一个任务在运行环境中的状态,也包含了 LDT 的段选择符。
保护模式下所有程序的执行都是发生在“任务”这一上下文中。当前任务的 TSS 段选择符保存在任务寄存器(TR, Task Register)中。
切换到某个任务:通过 CALL 或 JMP 切换到一个新的任务。新任务的 TSS 段选择符在 CALL 或 JMP 指令中给出。
处理器在切换任务时执行的操作:
- 将当前任务的状态存到当前 TSS 中
- 通过段选择符来为新任务加载任务寄存器
- 通过 GDT 中的段描述符来访问新的 TSS
- 从新的 TSS 中加载新任务的状态到通用寄存器、段寄存器、LDTR、控制寄存器 CR3、标志寄存器、EIP 寄存器
- 开始执行新任务
1.4 中断和异常处理
外部中断、软件中断和异常均通过 IDT(中断描述符表)进行处理。
IDT 存储了一些门描述符,这些描述符提供了访问中断和异常处理程序的权限。
1.5 内存管理
系统架构支持对内存的直接物理寻址和虚拟内存的分页寻址。分业结构中包含了页面在物理内存中的位置,分业结构存储于物理内存中。
1.6 系统寄存器
为了帮助处理器进行初始化和控制系统操作,系统架构提供了系统标识符,它们存于标志寄存器(EFLAGS)以及其它系统寄存器中。
二、操作模式
- 保护模式:处理器的原生操作模式,提供了丰富的架构特性、灵活性、高性能和向后兼容性。
- 实地址模式:提供了 8086 处理器的编程环境,带有一些扩展。
- 系统管理模式(SMM):所有 IA-32 处理器的标准架构特性,为操作系统提供了关于权力管理和 OEM 特性差异的透明机制。
- 虚拟 8086 模式:在保护模式下,处理器支持的一种准操作模式。允许处理器在受保护、多任务环境中执行 8086 软件。
- IA-32e 模式:该模式下,处理器支持两种子模式——兼容模式和 64 位模式。
保护模式->实地址模式:PE=0
实地址模式->保护模式:PE=1
三、8086 系统指令寄存器
标志寄存器
- ID:标识
- VIP:虚拟中断挂起
- VIF:虚拟中断标志
- AC:对齐检查
- VM:虚拟 8086 模式
- RF:恢复执行标志
- NT:任务嵌套
- IOPL:I/O 特权级别
- IF:中断允许标志
- TF:陷阱标志
图示如下
内存管理寄存器
- GDTR:保存 GDT 的基地址和 16 位表限制
- LDTR:保存 LDT 的 16 位段选择符、基地址、段限制、描述符属性
- IDTR:保存 IDT 的基地址和 16 位表限制
- TR:保存当前任务的 TSS 的 16 位段选择符、基地址、短线之、描述符属性
图示如下
控制寄存器
- CR0:包含控制操作模式和处理器状态的系统控制标志
- CR1:保留
- CR2:包含页面错误(page-fault)的线性地址
- CR3:包含分业结构层次的物理地址以及两个标志(PCD 和 PWT)
四、系统指令
- LGDT:读取 GDT(全局描述符表)寄存器
- SGDT:写入 GDT 寄存器
- LLDT:读取 LDT(局部描述符表)寄存器
- SLDT:写入 LDT 寄存器
- LIDT:读取 IDT(中断描述符表)寄存器
- SIDT:写入 IDT 寄存器
- LTR:读取任务寄存器
- STR:写入任务寄存器
作者:Wray Zheng
原文:http://www.codebelief.com/article/2017/11/reading-notes-of-ia-32-system-architecture-overview/