x86系统概览
第一次读,很多地方也没有完全弄懂,错误肯定一大堆。参考可以,切勿照抄。
1.1. 系统级体系结构概览
系统级体系结构由一系列寄存器,数据结构,和指令组成。
他们能够支持基本的系统级操作,包括内存管理,中断和异常处理,任务管理,和多核控制。
图 2.1 展示了应用于 32 位模式下的系统寄存器
和数据结构
-
全局和局部描述符表 ( Global and Local Descriptor Tables )
在保护模式中,访问内存需要给出段地址和偏移量。通过两者求和,来计算出内存中虚拟地址到实际的线性地址的映射。而每个段地址的信息(段基址,段限长,段属性)全部存储在其对应的
段描述符
这一结构中。所有的段描述符集中存放,即构成了描述符表,总共有两种描述符表,分别为全局描述符表
(GDT) 和局部描描述符表
(LDT) 。这种存储器分段管理机制,为存储器的共享和保护提供了机制,便于实现存储器访问特权的检查,实现了不同程序之间代码和数据的隔离和保密。
-
系统段, 段描述符, 门
系统结构中定义了两种系统段结构,分别为
任务状态段
(TTS) 和局部描述符表
。分别有对应定义的段描述符去访问他们。而全局描述符表
并不是一个段结构,因此也没有对应的段描述符或者段选择器其访问他。系统结构中同样定义了一种特殊的描述符,叫
门
(gates) ,具体的门种类有:call gates, interrupt gates, trap gates, task gates 。他提供了一种受保护的方式去调用跨特权的系统调用或者处理。当权限较低的代码段需要访问更高权限的代码段时,可以通过调用门的方式,获取到目标代码段的段描述符,有时也需要更改权限为目标代码段的所在权限。从而实现访问。
-
任务状态段和任务门
任务状态段
负责在操作系统进行进程管理的过程中,保存任务切换过程中任务现场的信息,并且通过他实现任务的挂起和恢复。任务状态段中包含 通用寄存器, 段寄存器, 标志寄存器, eip寄存器, 堆栈指针, 段描述符, 以及与分页相关的基址寄存器。当进行任务切换时,首先将当前任务的寄存器信息保存到
任务寄存器
所指向的当前任务的 TTS ,然后加载指向新任务的段选择器到任务寄存器中,再通过新的任务寄存器加载新任务所属的 TTS 至处理器的一系列寄存器组中。如此,实现了任务的切换。任务门
也可以实现任务访问,类似于调用门
,但与调用门不同的是,任务门访问的是 TTS 而不是 代码段
-
中断和异常处理
外部中断,软件中断和异常是通过
中段描述符表
(IDT) 处理的。中断描述符表储存着门描述符,可以访问中断和异常处理。中断描述符表不是一个系统段,中段描述符表的线性基址储存在 中段描述符表寄存器IDTR
中。中断处理过程中,处理器首先接收到内部硬件的中断向量和外部的中断控制或者中断指令,然后访问中断描述符表,再进行中断处理调用。此过程类似调用门或者任务门。
-
内存管理
系统支持直接物理寻址和虚拟地址寻址,当使用分页的时候,所有的代码,数据,堆栈,段都可以分页,但是只有最近访问的页会被保存在物理内存中。
分页结构的物理基址保存在控制寄存器
CR3
中,分页结构中的条目决定了页的物理基址,访问权限和内存管理等信息。
-
系统寄存器
为了帮助处理器的初始化和系统的控制,系统结构中设置了一些系统标志寄存器
- EFLAGS 寄存器 控制着任务和模式选择,中断处理,指令跟踪和访问权限。
- 控制寄存器(CR0、CR2、CR3和CR4) 包含用于各种系统级操作的标志和控制字段
- 调试寄存器 允许设置断点,供程序调试和系统软件中使用
- GDTR,LDTR,IDTR 包含各个表的线性地址
- 任务寄存器 TR 包含当前任务在 TTS 中描述符的线性地址
1.2. 实模式和保护模式转换
实地址模式-此操作模式提供Intel 8086处理器的编程环境,并带有一些扩展(例如切换到受保护或系统管理模式的能力)。
保护模式-这是处理器的本机操作模式。它提供了一组丰富的架构特性、灵活性、高性能和与现有软件库的向后兼容性。
两种模式之间的转换简要的分为以下几个步骤:
-
“实模式–保护模式”的跳转
- (1) 关中断
- (2) 打开地址线A20
- (3) 置cr0寄存器的末位为1 (PE = 1)
- (4) 实现跳转,进入到保护模式
-
“保护模式–实模式”的跳转
- (1) 从保护模式下的32位代码段跳转到16位代码段
- (2) 在16位代码段下初始化所有段寄存器
- (3) 置cr0的末位为0 (PE = 0)
- (4) 实现跳转,返回到实模式
1.3. 80x86系统指令寄存器
1. 标志寄存器
EFLAGS 标志寄存器 用来控制I/O,硬件终端,调试,任务切换和虚模式。只有相应的权限码能够修改其中的部分字节。
EFLAGS寄存器的状态标志(0、2、4、6、7以及11位),用于指示算术指令(如ADD, SUB, MUL以及DIV指令)的结果。
TF(bit 8) [Trap flag] 将该位设置为1以允许单步调试模式,清零则禁用该模式。
IF(bit 9) [Interrupt enable flag] 该标志用于控制处理器对可屏蔽中断请求(maskable interrupt requests)的响应。置1以响应可屏蔽中断,反之则禁止可屏蔽中断。
IOPL(bits 12 and 13) [I/O privilege level field] 指示当前运行任务的I/O特权级(I/O privilege level),正在运行任务的当前特权级(CPL)必须小于或等于I/O特权级才能允许访问I/O地址空间。这个域只能在CPL为0时才能通过POPF以及IRET指令修改。
NT(bit 14) [Nested task flag] 这个标志控制中断链和被调用任务。若当前任务与前一个执行任务相关则置1,反之则清零。
RF(bit 16) [Resume flag] 控制处理器对调试异常的响应。
VM(bit 17) [Virtual-8086 mode flag] 置1以允许虚拟8086模式,清除则返回保护模式。
C(bit 18) [Alignment check flag] 该标志以及在CR0寄存器中的AM位置1时将允许内存引用的对齐检查,以上两个标志中至少有一个被清零则禁用对齐检查。
VIF(bit 19) [Virtual interrupt flag] 该标志是IF标志的虚拟镜像(Virtual image),与VIP标志结合起来使用。使用这个标志以及VIP标志,并设置CR4控制寄存器中的VME标志就可以允许虚拟模式扩展(virtual mode extensions)
VIP(bit 20) [Virtual interrupt pending flag] 该位置1以指示一个中断正在被挂起,当没有中断挂起时该位清零。【Software sets and clears this flag; the processor only reads it.】与VIF标志结合使用。
ID(bit 21) [Identification flag] 程序能够设置或清除这个标志指示了处理器对CPUID指令的支持。
2. 内存管理寄存器
处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),用于指定分段内存管理所使用的系统表的基地址。处理器为这些寄存器加载和保存提供了特定的指令。
GDTR
GDTR寄存器中用于存放全局描述符表GDT的32位线性基地址和16位表长度值。基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。指令LGDT和SGDT用于加载和保存GDTR寄存器的内容。在机器刚加电或处理器复位后,默认基地址设置为0,而长度被设置成0XFFFF,在保护模式初始化过程中必须给GDTR加载一个新值。LDTR
LDTR寄存器中用于存放局部描述符LDT的32位线性基地址、16位段限长和描述符属性值。LLDT和SLDT分别用于加载和保存LDTR寄存器的段描述符部分。包含LDT表的段必须在GDT表中有一个段描述符项,当使用LLDT指令把含有LDT表段的选择符加载进LDTR时,LDT段描述符的段基地址、段限长度以及描述符属性会被自动加载到LDTR中。当进行任务切换时,处理器会把新任务的段选择符合段描述符自动加载近LDTR中。在机器刚加电或者处理复位后,基地址被默认设置为0,而长度值设置为0XFFFF。IDTR
IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值,指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。在机器刚加电或者处理复位后,基地址被默认设置为0,而长度值设置为0XFFFF。TR
TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。它引用GDT表中一个TSS类型的描述符。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。当使用LTR指令把选择符加载近任务寄存器时,TSS描述符中的段基地址、段限长度以及描述符属性会被自动的加载到任务寄存器中。当执行任务切换时,处理器会把新任务TSS的段选择符和段描述符自动加载到TR寄存器中。
1. 控制寄存器
控制寄存器决定了当前处理器的操作模式和当前正在处理的任务的特性
- CR0
含有控制处理器操作模式和状态的系统控制标志- CR1
保留- CR2
含有导致页错误的线性地址- CR3
含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR控制寄存器中各个比特位的含义:
1.4. 系统指令
以下一个系统指令,用于载入和保存 相关的描述符表
的基址寄存器或者任务寄存器。这些指令对应用程序是无用的,但有些指令也不允许用户程序操作。
LGDT
SGDT
LGDT指令将GDT的入口地址装入GDTR寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT。GDTR中存放的是GDT在内存中的基地址和其表长界限。SGDT用于保存GDTR寄存器中的值。
LIDT
SIDT
用于加载和保存LDTR寄存器的段描述符部分,即段基址和段限长度。
LLDT
SLDT
用于加载和保存IDTR寄存器
LTR
STR
TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。
限长度。
LLDT
SLDT
用于加载和保存IDTR寄存器
LTR
STR
TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。
参考文章:
操作系统篇-浅谈实模式与保护模式https://www.cnblogs.com/chenwb89/p/operating_system_002.html
操作系统篇-分段机制与GDT|LDT
https://www.cnblogs.com/chenwb89/p/operating_system_003.html
TSS(任务状态段)
https://www.cnblogs.com/wanghetao/archive/2011/10/28/2228130.html
“实模式–保护模式–实模式”转换过程
https://blog.csdn.net/judyge/article/details/52373643