X86目前的架构有32位和64位两种,不同的架构支持的运行模式也是不一样的,64位的基本能兼容32位。64位是X86架构的主流,本文内容默认以64位位基础。X86平台目前的支持的运行模式有以下几种:
1、实模式:这是最早的X86运行模式,用于早期的8086、8088和8080处理器;实模式使用16位地址线,支持最大640KB的内存空间;实模式不支持内存保护、分页和多任务处理等现代操作系统特性。
2、保护模式:X86架构的一个重要特性。从80286处理器开始引入;它使用32位地址线,理论上可以支持最大4GB的内存空间;保护模式引入了内存保护、分页和多任务处理等现代操作系统特性。大多数现代操作系统都是在保护模式下运行的。
3、系统管理模式:从Pentium处理器开始引入的。SMM模式可以与保护模式并行运行,SMM模式的代码可以不影响保护模式操作的情况下执行;SMM模式提供了硬件级别的保护,操作系统无法访问SMM代码和数据。
4、IA-32e模式:也称为长模式,是从Pentium4处理器开始引入的;IA-32e模式支持64位地址线,理论上可以支持无限大的内存空间;包含两种子模式:IA-32e兼容模式,处理器可以同时执行32位和16位代码,IA-32e64位模式,也称为纯64位模式,处理器在此模式下只能执行64位代码。
IA-32架构(从处理器Intel386处理器系列开始)为操作系统提供了广泛的支持。这些支持是IA-32系统架构的一部分,包括下面几个部分:
内存管理
软件模块保护
多任务
异常和中断处理
多处理器技术
高速缓存管理
硬件资源和电源管理
调试和性能检测
一、系统级架构概况
IA-32系统架构是由寄存器、数据结构和指令组成。下图给出了一个系统寄存器和数据结构的概况:
1.1全局和局部描述符表
在保护模式下操作时,所有的内存访问,要么通过全局描述符表GDT,要么通过局部描述符表LDT。这些描述符表里是段描述符,段描述符里包含了段的基址、访问特权、类型和用法信息。段
每个段描述符都有一个与之相关的段选择符,段选择符里包含以下信息:
GDT或LDT(与它相关的段描述符)里的一个索引
一个全局/局部标志
访问权限等信息
程序员编写的程序通过编译器生成目标代码,该代码包含了各种变量和指令,目标代码被连接器链接成可执行文件,该文件包含了程序的指令和数据。可执行文件加载到内存中运行的时候,操作系统会为该程序分配一段连续的虚拟内存空间。CPU执行程序时,会使用逻辑地址来引用内存中的数据。逻辑地址由两部分组成:段选择符和偏移量。偏移量通常是指令的一部分,CPU会加载指令中的偏移量,这就是段内的具体位置。
段选择符位于CPU寄存器中,包含段描述符表的索引,GDTR或LDTR保存的段描述符表地址,通过这个索引和段描述附表的地址就可以加载段描述符,段描述符中保存着段的基址。基址和偏移量组合就可以得到线性地址。
将线性地址经过页面映射后,得到物理地址。
1.2 系统段、段描述符和门
除了代码、数据和堆栈段外,系统架构还定义了两个系统段:任务状态段(TSS)和LDT。这些段都有一个专门为它们定义的描述符。
系统架构也定义了一套称为门的描述符(调用门、中断门、陷阱门和任务门),这些门提供了一种访问运行在不同于应用程序特权级的系统过程和处理程序的方法。
1.3任务状态段和任务门
任务状态段(TSS):定义了任务执行环境的状态。这些状态包括通用寄存器、段寄存器、EFLAGS寄存器、EIP寄存器和段选择符以及三个堆栈段(特权0、1、2各一个堆栈)的指针的状态。它也包括了于任务相应的LDT的选择符和页表的基地址。当CPU从一个任务切换到另外一个任务时,它会使用TSS描述符来保存当前任务的上下文信息,并加载新任务的TSS描述符来恢复新任务的上下文信息。
任务门:是一个特殊的门描述符,它用于允许CPU从一个任务切换到另一个任务。任务门描述符存储在全局描述符表(GDT)中。当CPU执行任务门描述符时,它会加载和任务门相关的TSS描述符,并跳转到该TSS描述符中通的EIP寄存器的值。
所有运行在保护模式下的程序,都是一个称作当前任务的上下文中进行的。当前任务的TSS的段选择符保存在任务寄存器中。切换到一个任务最简单的方法是进行CALL或JMP到那个任务中。新任务的TSS的段选择符是通过CALL和JMP指令给出。在进行任务切换时,处理器按照下面的次序进行:
1.保存当前TSS中当前任务的状态
2.装载新任务段选择符的任务寄存器
3.通过GDT中的段选择符访问新的TSS
4.将新TSS段中新任务的状态装载到通用寄存器、段寄存器、LDTR、控制寄存器CR3、EFLAGS寄存器和EIP寄存器
5.开始执行新任务
1.4 中断和异常处理
外部中断、软件中断和异常时通过中断描述符表(IDT)处理的。如上图所示,IDT包含了访问中断和异常处理程序的门描述表的集合。IDT不是一个段,IDT的线性基地址包含在IDT寄存器中(IRTR),IDT中的门描述符有中断、陷阱、或任务门类型。
陷阱:计算机有两种运行模式:用户态和内核态。其中操作系统运行在内核态。在内核态中,计算机可以运行任何指令;相反用户程序运行在用户态,软件只能使用少数的指令,并不具备直接俄访问硬件的权限。当软件需要访问硬件或者调用内核中的函数的时候,就会用到陷阱,陷阱指令可以使执行流程从用户态陷入内核,并把控制权转移给操作系统,使得用户可以调用内核函数和使用硬件从而获得操作系统所提供的服务,比如用视频播放器播放电影的时候,视频软件就发出陷阱使用显示器和声卡。陷阱发生的时间是固定的。
中断:中断是由外部事件导致并且它发生的时间是不可预测的,这一点和陷阱不同。外部中断主要是指时钟中断、硬件中断等。如果一个程序运行了足够长用完了分配给它的时间片,CPU决定切换到另一个进程运行,就会产生一个时钟中断,切换到下一个进程。硬件中断就是由硬件引起的。中断的发生是随机的且主要作用是完成进程间的切换,从而支持CPU和设备间的并行。
中断和陷阱的另一个重要差别是,CPU处理中断的完成中会屏蔽中断,不接受新的中断直到此次中断处理完成,而陷阱的发生不屏蔽中断,可以接受新的中断。
【注】中断是异步发生的,而陷阱是同步发生的,中断是为了处理外部事件或更高级别的任务,陷阱用于处理程序中的异常情况或请求操作系统服务。中断涉及到上下文切换,陷阱是程序的一部分,程序在陷阱处理完后会继续执行,不涉及上下文切换。
异常:程序执行过程中的异常行为。比如除零异常,缓冲区溢出等,异常是指CPU执行指令时本身出现的问题。
在运行中断或异常处理程序时,处理器会获得一个中断向量(中断数字),里面保存了IDT门描述符的索引。如果选中的门描述符是一个中断门或陷阱门,相应的处理程序类似于调用门调用过程。如果门描述符是一个任务门,就通过任务切换进行的。
1.5 内存管理
X86架构支持直接物理地址内存或者虚拟内存(通过分页)。当直接用物理地址时,线性地址就是物理地址,当使用分页时,所有代码、堆栈、系统段、GDT、IDT都可以将最近访问过页驻留在内存中而进行分页。
1.6 系统寄存器
为例有助于初始化处理器及其控制系统的运行,架构在EFLAGES寄存器中系统标志和几个系统寄存器:
EFLAGES寄存器的系统标志和IOPL域
控制寄存器
测试寄存器
GDTR、LDTR、IDTR
任务寄存器
模式相关的寄存器
1.7 其它系统资源
操作系统指令
性能监测计数器
内部高速缓存和缓冲区