分类: LINUX
2011-11-05 22:47:52
卷2 系统编程
前言本卷用于系统软件设计人员编写操作系统、加载器、链接器、设备驱动和系统工具等。阅读前请先了解卷1(应用编程)。
本卷讲解系统软件涉及的AMD64架构相关资源和功能,主要包括:操作模式控制、内存管理、中断和异常、任务和状态切换管理、系统管理模式(包括电源管理)、多处理器、调试以及处理器初始化。
组织结构
Ø 系统编程概述
Ø 相比X86架构(本文件用X86表示传统的32位架构即i386架构)系统编程的区别
Ø 系统资源 – 系统寄存器和CPUID
Ø 段式虚拟地址 – 段式内存模型及相关数据结构和保护检查
Ø 页转换和保护 – 页转换功能及及相关数据结构和保护检查
Ø 系统管理指令 – 管理系统的功能指令
Ø 内存系统 – 内存系统层次体系及相关资源和协议,包括:内存特性、Cache和Buffer
Ø 异常和中断- 异常和中断的类型、起因和处理方法等细节
Ø Machine-Check机制 – 探测及处理Machine-Check错误的资源和功能
Ø 系统管理模式 – SMM,包括电源管理
Ø SSE/MMX/X87编程 – 介绍应用的使用,以及操作系统的状态保存
Ø 多处理器管理 – 多处理器环境的指令集、系统资源和功能
Ø 调试和性能资源 – 介绍软件调试和性能监控
Ø 传统模式的任务管理 – 传统的硬件多任务管理及相关寄存器和数据结构
Ø 处理器初始化和长模式激活
Ø 操作模式间的混合代码 – 不同操作模式间运行程序的注意事项
Ø 案例虚拟机 – 支持虚拟化开发和部署
1系统编程综述
系统软件开发需要访问系统资源,这些系统资源通常只能在最高特权级别(CPL=0)才有权限访问,访问系统资源的软件称作特权软件(如操作系统)。特权级别在第4章会讲解。
本章介绍AMD64架构系统软件开发过程中要用到的一些基本特性,主要有:
Ø 支持的地址格式以及内存是如何组织的
Ø 内存管理硬件如何利用不同的地址格式去访问内存
Ø 处理器的运行模式划分,以及不同运行模式下的内存管理硬件行为
Ø 系统控制寄存器
Ø 中断和异常机制,如何打断程序执行以及上报错误
Ø 其它特性:硬件多任务、MCE(Machine-Check Exception)、软件调试和性能优化
AMD64架构增强并且兼容传统X86架构的许多特性。
1.1 内存模型
AMD64内存模型兼容传统的(Legacy)X86内存模型,系统软件通过AMD64内存模型可以安全地管理用户程序和数据。类似于X86,AMD64设计了硬件转换机制将虚拟地址映射到物理地址,这样就能保证系统软件透明地重定向物理内存空间(或操作系统管理的硬盘驱动器)的应用程序和数据。
AMD64包括2种运行模式:长模式和传统模式(见卷1)。长模式的64-bit子模式实现了平坦内存模型(flat-memory model),传统模式实现了X86架构的所有内存模型。
1.1.1 内存寻址
AMD64支持地址重定向,为此定义了4种地址类型:
Ø 逻辑地址(Logical Address)
Ø 有效地址(Effective Address)
Ø 线性地址(Linear Address)或虚拟地址(Virtual Address)
Ø 物理地址(Physical Address)
逻辑地址:逻辑地址涉及到段地址空间,由段选择子和段内偏移组成,表示为:
逻辑地址 = 段选择子:段内偏移
逻辑地址可以用作远指针(Far Pointer),即跨越当前段的寻址。
有效地址:有效地址就是段地址空间中的段内偏移,因此也可以这样说:逻辑地址是由段选择子和有效地址组成的。也可以简单认为有效地址就是程序中生成的地址。
有效地址由基址(Base), 比例(Scale), 索引( Index)和位移(Displacement)四个元素组成,表示为:有效地址 = 基址 + (比例 * 索引) + 位移
四个组成元素:
a) 基址:存放在通用寄存器中的地址值;
b) 比例:1, 2, 4, 8;
c) 索引:存放在通用寄存器中的二进制补码值;
d) 位移:编码在指令码中的8-bit, 16-bit, 32-bit二进制补码值。
有效地址可以用作近指针(Near Pointer);当前段中跳转用的指针为近指针,平坦内存模型下的指针都是近指针。
长模式下定义了64-bit的有效地址长度。如果处理器的具体实现没有用到64-bit(例如只用了52-bit),有效地址未用的高位必须是全0或全1(称为规范形式,Canonical Form)。
线性地址(又称虚拟地址):逻辑地址的段选择子,用于从LDT(Local Description Table)或GDT(Global Description Table)中选取对应的段描述符,段描述符描述了段的基地址(简称段基址),段基址表示段在线性地址空间中的起始地址,段空间可以有多个,线性空间只有一个,段空间的逻辑地址最终必须转成线性空间中的线程地址,线程地址最终会映射成物理地址。线程地址从逻辑地址转化而来,表示为:
线程地址 = 段基址 + 有效地址
平坦内存模型下(64-bit模式),段基址在设计上看作0,线程地址就是有效地址;类似于有效地址,长模式下的线程地址必须符合规范形式(Canonical Form)。
物理地址:物理地址即主存(main memory);当分页机制使能时,线性地址被转成物理地址;当分页机制没有使能时,物理地址等同于线程地址。
1.1.2 内存组织形式
AMD64架构有2种内存组织形式:虚拟内存和物理内存;虚拟内存和物理内存空间的大小通常是不一样的,一般来说,虚拟内存空间要大些。系统软件通过硬件的内存管理机制来映射虚拟内存到物理内存,这样在系统软件来看就会拥有更大的内存空间,但实际上是经过重映射后的虚拟空间,即将物理地址空间重映射到了更大的虚拟地址空间上面。
虚拟内存
软件通过虚拟地址来访问虚拟地址空间;系统软件使用分段和分页来管理应用程序和数据在虚拟地址空间的重映射。AMD64不同的模式有不同的地址转换模式,支持不同的虚拟地址空间:
Ø 实模式和虚8086模式(传统模式的子模式) – 使用20-bit虚拟地址,支持1MB虚拟地址空间;
Ø 保护模式(传统模式的一个子模式) – 使用32-bit虚拟地址,支持4GB虚拟地址空间;
Ø 长模式 – 使用64-bit虚拟地址,支持16EB(1EB=2^60B)虚拟地址空间;兼容模式下,使用32-bit到零扩展的64-bit虚拟地址,单个程序只能访问4GB范围的虚拟地址空间。
物理内存
通过物理地址直接访问主存;具体到计算机系统中,可用的物理地址空间大小就是系统
中安装的主存大小;最大可访问的物理地址还要取决于处理器的实现以及地址转换模式。AMD64有如下地址转换模式:
Ø 实模式 – 无分页功能,分段功能是必选的;使用20-bit物理地址,支持1MB物理地址空间;段式转换;
Ø 虚8086模式 – 分页功能是可选的,分段功能是必选的;开启分页功能:使用32-bit物理地址,支持4GB物理地址空间(单个程序限制在1MB范围的物理空间);未开启分页功能:使用20-bit物理地址,支持1MB物理地址空间;
Ø 保护模式 – 分页功能是可选的,分段功能是必选的;使用32-bit物理地址,支持4GB物理地址空间;具有段式和页式两种转换机制;段式转换机制一直是开启的;页式转换机制下(开启分页功能即段页式管理),如果开启了PAE(Physical Address Size Extension),使用52-bit物理地址,支持4PB物理地址空间(目前AMD64只支持40-bit PAE,共1TB物理空间);
Ø 长模式 – AMD64特有的模式;分页功能是必选的,64-bit模式下分段功能自动被硬件禁用,兼容模式有分段功能;使用52-bit物理地址,支持4PB物理地址空间;兼容模式下,单个程序限制在某个4GB范围的物理空间(物理地址是52-bit);长模式下需要开启PAE和分页功能。
1.1.3 规范地址形式(Canonical Address Form)
长模式定义了64-bit虚拟地址空间,但处理器的具体实现可以使用更小的虚拟地址空间。对于实现了更小的虚拟地址空间的处理器,需要检查从bit63到实现最高bit的位是否符合值全0或全1,符合此规则(即值是全0或全1符号扩展)的虚拟地址称为规范地址形式;例如某处理器的实现只用了52-bit虚拟地址,bit52~bit63必须是全0或全1。非规范地址的引用会导致#GP异常,进一步,当所访问的地址为栈地址时,暗示的栈访问会产生#SS栈异常而不是#GP异常(暗示的栈访问指:PUSH, POP以及任何将RSP或RBP作为基础寄存器进行访问的指令)。
规范地址形式避免了应用程序使用未实现的高位,从而使得应用程序可以无修改地运行在别的实现了更大虚拟地址空间的长模式处理器上。
1.2 内存管理
内存管理可以通过分段和分页两种手段,将程序生成的地址转化为物理地址。内存管理由系统软件和处理器硬件完成,对应用程序不可见。
1.2.1 分段(Segmentation)
分段是为了支持多任务并发执行,每一个任务对应各自的段空间,段之间支持保护访问限制,实现了程序和数据从物理地址空间到虚拟地址空间的重映射,从而达到隔离的效果。
AMD64支持X86支持的所有形式的段,然而大部分现在系统软件并没有利用段来隔离任务,取而代之的是分页机制。因此AMD64长模式中的64-bit(子)模式取消了段的设计,使用了平坦内存模型,这使得新的64-bit系统软件的设计变得更加简单和高效。
为了兼容X86,AMD64除了64-bit模式的其它模式(即兼容模式和传统模式)还是要使用段,段的信息存放在段描述符中,段描述符位于2个系统描述符表LDT和GDT中,每个表可存放8192个描述符,为了防止加电后段寄存器未初始化(值为0)就进入保护模式并使用GDT,X86架构规定GDT的第一个描述符的值必须为全0,所以最多支持16,383个段;描述符表是一个数组,段选择子用来作为数组下标来访问对应的段描述符。段描述符包含有:段基址(Base),段大小(Limit),段保护权限(Protection)和一些段属性。段大小是可配置的。
平坦段(Flat Segmentation)
平坦段是分段的一种特殊情况。传统的平坦内存模型中,所有的段基址为0,段大小为4GB,分段不能禁用,而平坦段相当于有效地禁掉了段转换(分段机制仍然是存在的),这样有效地址就等同于虚拟地址。
AMD64长模式下,运行在64-bit模式下的软件会自动使用平坦内存模型;64-bit模型下,段基址被看作为0,段大小被忽略,这使得有使用效地址可以访问处理器支持的所有虚拟地址空间。
1.2.2 分页(Paging)
分页允许程序和数据被重定向到物理地址空间中,物理地址空间被划分成固定大小的区间,称作物理页面(Physical Page);X86架构支持4KB, 2MB和4MB三种大小的物理页面。类似于段式转换机制(分段),分页机制会限制低权限的程序直接访问物理页面。
页式转换机制的页表用于将虚拟地址转换成物理地址,页表分级别,利用虚拟地址的某部分作为索引在不同的级别中寻找下一级别的表项;根据物理页面的大小以及处理器的运行模式,页表级别可分成1~4级,页表中存放物理地址,页表基址需要4KB对齐。
AMD64长模式下,分页必须开启。
1.2.3 段页式
分段功能不能禁用,分页功能则完全可以被禁用。页式内存管理需要一点分段资源,而段式内存管理不需要任何分页资源。
段大小是可以配置的,从1B~4GB范围,因此多个段可以映射到一个物理页,多个物理页可以映射到一个段;段基址和物理页边界无对齐要求,但为了方便管理,软件一般都是对齐处理的。
分段在X86是不能被禁用的,在AMD64的64-bit模式下分段被禁用的,但X86的平坦段起到了禁用分段后等同的效果。64-bit模式忽略了4GB段大小,并成了平坦内存分页模式。
1.2.4 实地址寻址(Real Addressing)
实地址寻址是为了兼容先前的8086处理器(20根地址总线)而设计的,处理器需要运行于实模式;实地址寻址将 16-bit有效地址转换成20-bit物理地址,提供1MB物理地址空间。
实模式下,段寄存器中表示的不再是选择子,而是直接的地址数据,将此数据左移4位即乘以16后作为20-bit段基址(物理地址),加上16-bit有效地址后便是实际的物理地址。8086处理器使用A20M#输入信号来处理地址Wrapping,当段基址和有效地址的和进位到了bit20,就通过这个信号将A20地址位屏蔽掉。
实模式下,段需要以16B对齐(段寄存器中低4位为0),每一个段代表64KB长度的区间,总共寻址1MB物理地址空间。
1.3 运行模式
X86支持4种运行模式,不同模式下提供了不同的内存管理、虚拟内存大小、物理内存大小,以及保护;4种模式为:
Ø 实模式(Real Mode)
Ø 保护模式(Protected Mode)
Ø 虚8086模式(Virtual-8086 Mode)
Ø 系统管理模式(System Management Mode)
AMD64支持X86的所有运行模式,称为“传统模式”(Legacy Mode);并设计了一种全新的模式,称为“长模式”(Long Mode);因此,AMD64共有2种模式:传统模式和长模式;传统模式包括了X86的4种子模式,长模式包括64-bit模式和兼容模式。
1.3.1 长模式
长模式包含2个子模式:64-bit模式(64-bit模式)和兼容模式(Compatible Mode)。64-bit模式支持一些新特性,如64-bit虚拟地址空间;兼容模式允许在64位的系统软件(如64位操作系统)下,运行16位/32位应用程序(是二进制兼容的,不需要重新编译);长模式下取消了硬件多任务机制。
声明:本卷使用“长模式”描述时表示64-bit模式和兼容模式共有的特性,当子模式特有的功能时,会直接使用子模式的名称进行描述。
使能和激活长模式(通过改变EFER.LME位,EFER:Extended Feature Enable Register)之前,系统软件必须先使能操作模式(即只能从保护模式进入长模式),长模式的具体细节请参考第14章。
1.3.2 64-bit模式
64-bit模式支持64-bit的系统软件和应用程序,引入了如下新新性:
Ø 64-bit虚拟地址空间(具体处理器可能实现较小的空间)
Ø 通过REX指令前缀扩展寄存器:
- 增加R8-R15通用寄存器
- 所有通用寄存器扩充到64位
- 增加了8个YMM/XMM8-15 SSE 256/ 128位寄存器
Ø 64位RIP寄存器
Ø 增加RIP相对数据寻址
Ø 平坦段地址空间
64-bit模式通过CS寄存器使能(控制64-bit模式和兼容模式之间的切换),传统的段机制
被禁用,分页机制需要使能,软件方面需要64位的系统软件和工具来运行此模式。
1.3.3 兼容模式
对现有的X86下的16位/32位应用程序保持二进制兼容,此模式下运行有长模式下的64位系统软件。
兼容模式下,应用程序只能够访问4GB虚拟地址空间;CS寄存器控制兼容模式和64-bit模式之间的切换;与64-bit模式另一个不同,段机制和X86的保护模式保持一致,但与X86不同的是,分页机制是使能的。
从应用程序的角度来看,兼容模式和开启了分页机制的X86保护模式是一致的;从系统软件(操作系统)的角度来看,兼容模式下运行的是长模式的系统软件、地址转换机制、中断异常处理,和系统数据结构。
1.3.4 传统模式
AMD64的传统模式包括:实模式、保护模式和虚8086模式。传统模式下不仅能提供与X86架构的16位/32位应用程序兼容,还能保持16位/32位系统软件的兼容(相比,兼容模式下的系统软件必须是64位的)。
实模式
又称为实地址模式。此模式下,处理器支持1MB的物理内存空间,操作数默认是16位,AMD64的实模式可能通过指令前缀(操作数大小指令前缀,66h)变成32位的;中断处理和地址生成和80286处理机保持一致;不支持分页;所有软件在特权等级0下运行。
上电或重启时,处理器会运行在实模式下;长模式下没有实模式,原因是长模式需要从开启分页的保护模式切入。
保护模式
保护模式支持4GB的虚拟内存空间,4GB的物理内存空间,16位或32位操作数;所有的段式转换,段保护和硬件多任务机制都是可用的;分页是可选的;系统软件可以通过分段在虚拟地址空间中重定向有效地址。
保护模式下,软件可以在特权等级0~3运行;通常应用程序运行在特权等级3,系统软件运行在特权等级0和1;80286处理器首先引入了16位保护模式特性。
虚8086模式
通过保护模式切入;虚8086模式下,可以运行16位的实模式下运行的软件,在8086, 8088, 80186和80188处理上运行的程序都可以在此模式下运行,但运行特权等级为3;支持虚拟地址空间1MB,操作数大小为16位,AMD64虚8086模式下可以通过操作数大小指令前缀来使用32位的操作数;使用实地址模式转换;与实模式不同的是,分页是可选的,并且开启分页后的物理地址是32位的。
EFLAGS.VM位控制虚8086模式的切入切出,POPF指令不能改变VM位,VM位只能通过2种方式访问:
a) 任务切换时,从TSS段中载入EFLAGS;
b) 特权软件执行IRET指令(中断发生时,硬件会自动将EFLAGS压栈)。
长模式不支持虚8086模式,当长模式使能时,岂图使能虚8086模式将自动被硬件忽略。
1.3.5 系统管理模式(SMM)
SMM模式是一种特殊设计的模式,主要是针对BIOS和特殊的低层驱动设计的,对传统的系统软件是透明的。SMM模式可用于电源管理;SMM模式下,设计了一个专有的SMM内存区域,可以专放代码和数据,SMM内存区域通过SMM输出信号和主存隔离起来。
SMI(System Management Interrupt)中断触发后进入SMM模式,并切换SMI内存区域,运行事先准备好的处理函数;SMM模式使用实地址模式,可以访问4GB的段大小,操作数、地址和栈指针默认都是16位的(可以使用指令前缀来改变这些默认值)。
1.4系统寄存器
系统软件使用系统寄存器来管理处理器的运行环境,定义系统资源特性,监控软件执行。图1-7展示了AMD64的系统寄存器。除了RFLAGS外,其它的寄存器都只能在特权等级下读写;IDT/LDT/GDT寄存器包括64位的基址和一些特殊位,其它的系统寄存器都是64位。
按图1-7中,简单介绍一下系统寄存器:
Ø 控制寄存器(Control Registers) – 控制系统运行模式和一些系统特性;
Ø 系统标记寄存器(RFLAGS) – 包括系统状态的标记和掩码,例如虚8086模式切换,I/O特权等级(IOPL)和中断;
Ø 描述符表寄存器(Descriptor-Table Registers) – 保护模式下段选择子对应的段数据结构;IDTR/LDTR/GDTR;
Ø 任务寄存器(Task Register) – 硬件多任务机制中,利用此寄存器访问TSS (Task State Segment) 段数据结构的位置和大小;任务寄存器存放的是TSS选择子,从描述符表寄存器中获取到TSS描述符,再通过TSS描述符定位到最终的TSS数据结构;
Ø 调试寄存器(Debug Registers) – 提供软件调试机制和信息。
AMD64定义的MSR(Model Specific Registers):
Ø EFER寄存器(Extened Feature Enable Register) – 控制CRn寄存器中不能控制的一些特性,如EFER.LME可以控制长模式;
Ø SYSCFG寄存器(System Configuration Register) – SYSCFG使能和配置系统总线;
Ø 系统链接寄存器(System Linkage Registers) – 给系统链接指令(如SYSENTER)使用,来描述操作系统的入口点、栈位置和系统数据结构的指针;
Ø MTRR寄存器(Memory Type Range Registers) – 控制系统内存的属性,如Cache属性,读写乱序属性等;
Ø 调试扩展寄存器(Debug-Extension Registers) – 提供额外的软件调试功能;
Ø 性能监控寄存器(Performance Monitoring Registers) – 监控处理器和系统的事件以及事件的持续时间(性能计数器);
Ø MC寄存器(Machine Check Registers) – 处理器对不能恢复错误的反应,对此类错误提供检测和信息。
1.5系统数据结构
系统数据结构由软件创建和维护,提供给运行在保护模式下的处理器使用,处理器利用这些数据结构进行内存管理和保护,保存中断和任务切换时的程序状态信息等。
AMD64的系统数据结构:
Ø 描述符(Descriptors) – 描述符给处理器提供段信息,例如段基址、段大小和特权等级;常见的描述符有代码、数据和栈描述符;门(Gate)是另一种特殊的描述符(中断门/陷井门/任务门/调用门),给软件提供一段执行代码,中断门和陷阱门主要用于中断例程,存放在IDT(Interrupt Descriptor Table)中;软件必须最少定义当前代码段和栈的描述符;
Ø 描述符表(Descriptor Tables) – 存放描述符的表,以数组的形式组织;表的地址是虚拟地址;LDT是可选的;系统软件必须使用IDT和GDT;
Ø TSS段(Task State Segment) – TSS段是一个特殊的用于存放某个任务的处理器状态的段,TSS段中还包含有不同特权级别下的SP指针;硬件多任务机制使用TSS信息来实现任务的暂停和继续运行;即使不使用硬件多任务机制,系统软件也必须至少初始化1个TSS段,用来实现不同特权级别的SP的自动切换(Call或中断会导致硬件自动访问当前TR寄存器,取出所引用TSS段中的不同特权级别的SP值,并将当前特权级别的SP值放入SP寄存器中);
Ø 页转换表(Page Translation Tables) – 分页机制开启后,就要使用页转换表(简称页表);保护模式下是可选的;长模式下是必选的;页表通常分级层次的,传统模式下的页表是1~4级;长模式下的页表是4级,将64位虚拟地址转成52位物理地址。
1.6中断
当中断或异常发生时,AMD64架构处理器会自动暂停(中断)当前软件的执行,之后进
入由系统软件事先准备好的一个处理函数(运行在特权级别下),处理函数运行结束后重新返回之前被暂停(中断)的软件;系统硬件通过处理器的外部中断信号来产生中断。另外,处理器执行指令遇到非正常条件后会自动触发异常。
中断和异常机制基本类似,不同的是:
Ø 中断在当前指令执行结束后产生,异常是在当前指令执行过程中产生;
Ø 中断结束后返回到当前指令的下一条指令,异常结束后一般返回到当前指令(系统调用返回到当前指令的下一条指令);
Ø 异常发生时,与中断相比处理器会自动多将一个错误码入栈(即当前TSS段中异常对应的特权等级SP值代表的栈);
Ø 中断发生时处理器自动关中断,异常发生时中断状态保持不变;
Ø 关中断后不会发生中断,但依然会发生异常;
Ø 中断通常由硬件自动产生,异常通常可以由软件产生(如系统调用);
Ø 中断对应的中断门的DPL(DPL为描述符特权级别)一般设为0;异常对应陷阱门,在用户态产生的异常(如系统调用)对应的陷阱门的DPL一般设为3,不能由用户态产生的异常对应的陷阱门的DPL一般设为0;
Ø 中断发生时硬件会自动忽略中断门的DPL(设成0的原因是为了防止低特权级别下用软件模拟中断,如INT2);异常发生时硬件会自动检查DPL值(这就是为什么系统调用对应的陷阱门的DPL通常设为3的原因,以保证用户态允许执行系统调用)。
尽管中断和异常不完全一样,本卷还是用“中断”来通称中断和异常。
为了使用中断机制,系统软件要建立好中断处理函数用于中断产生后的跳转入口,并初始化相关系统数据结构,要初始化的数据结构有:中断处理函数所在的代码段描述符(存放在GDT或LDT中),中断处理函数的入口地址,存放在IDT(Interrupt Descriptor Table)中的中断门(用于中断)或陷阱门(用于异常)。
中断发生时,处理器会根据中断向量号(硬件自动产生,数值就是IDT表的数组索引值)在IDT中查找到对应的门描述符,门描述符中含有中断处理函数所在的代码段选择子以及在此段中的有效地址,之后处理器会根据代码段选择子从GDT或LDT(通常是GDT中)中获取代码段描述符以定位出中断处理函数的入口地址;中断发生时,处理器会从当前的TR寄存器中找到当前的TSS段,段中会含有中断处理函数所在特权级别的SP值,将这个SP值放入SP寄存器中即设置中断所用的特权级别的栈(例如,Linux中的任务有2个栈,一个是用户栈,特权级别为3,另一个是内核栈,特权级别为0,内核栈存放在当前TSS段中,任务切换时Linux会将TSS段中此处值更新成别的任务的内核栈;中断发生后处理器会自动将TSS段中的此处的值存入SP寄存器中从而切换成内核栈)。
1.7其它功能
1.7.1 硬件多任务
处理器可以执行任务,暂停任务以及从暂停点恢复任务继续执行,当任务被暂停时,其它任务就可以继续执行了,称为一次任务切换。每一个任务都有各自私有的执行空间,包括不同特权级别的代码段、数据段和堆栈段;任务可以通过页式转换机制拥有各自的虚拟内存环境。任务暂停和继续时,需要一个数据结构来保存任务的当前执行状态信息,称为TSS(Task State Segment)结构;硬件多任务机制可以将由硬件来完成任务的切换过程,任务的切换需要通过TSS数据结构来完成。硬件多任务切换过程如下(硬件自动完成,通过LDTR指令):
Ø 当前任务的当前指令执行完成后,自动保存此任务当前执行状态信息;
Ø 任务当前执行状态信息存放在该任务的TSS数据结构中;
Ø 选择新任务的TSS数据结构恢复至处理器的各寄存器中;
Ø 新任务开始接着上次暂停的状态继续运行。
传统模式的硬件多任务机制是可选的,而现代操作系统一般并不使用此机制进行任务切
换,而是采用软件实现的;AMD64长模式不支持硬件多任务机制。但不管用不用硬件多任务机制,由于TSS数据结构中存放有一些关键执行环境信息以及一定的控制转换功能,任何模式下都必须初始化至少一个TSS数据结构。更详细的内容请参考第12章。
1.7.2 Machine Check
AMD64提供了MCE(Machine Check Exception)功能,这对于对可靠性、可用性和可服务性要求比较严格的系统中是有用的。MCE提供了严重和不可恢复的硬件错误的检测和报告功能,使用MCE提供的信息可以使得复杂系统中的问题能够更加精确地定位出来。
MCE的错误报告是实现相关的,详细的描述请参考第9章;更详细的信息,需要参考BIOS和内核开发相关指导手册。
1.7.3 软件调试
硬件提供调试机制供软件快速地解决错误,即可以调试应用软件也可以调试系统软件,调试功能需要在特权级别下使用。通常,软件调试支持是由运行特权级别下的应用软件来完成的,而不是操作系统。
AMD64提供了如下的调试设施:
Ø 程序的指令位置断点;
Ø 指令地址配置的断点;
Ø 数据地址配置的断点;
Ø 硬件多任务机制开启时,可设置任务切换断点;
Ø 指令单步执行断点;
Ø 分支和中断单步断点;
Ø 记录某个程序的分支和中断历史统计数据。
有些处理器会提供额外的实现相关的调试支持,具体的系统请参考相关资料。
1.7.4 性能监控
系统开发过程中,发现并解决性能瓶颈与解决错误同样重要;AMD64提供了硬件性能监控功能,只能在特权级别使用,但非特权级别的软件可以通过特权级别的软件授权后使用。
性能监控提供了检测处理器发生的事件和事件持续的时间,性能分析软件可以通过这些数据计算出来频繁发生的事件以及执行这些事件占用的时间,从而快速找到性能优化方向。
后面章节会进一步介绍性能监控。另外性能监控的事件定义通常是实现相关的,具体系统请参考相关指导手册。
2 X86和AMD64的差异
AMD64设计目的是为了提供先前的X86架构的完全二进制兼容(先前的32位应用程序不用重新编译)。本章总结AMD64的新特性和架构增强功能,并与X86进行比较;AMD64的绝大部分新特性只在长模式(64-bit模式,兼容模式)下可用,少数新功能在兼容模式下可用。
本章节假设读者已熟悉X86架构;如果不,请跳过本章了解其它章节后再回来阅读本章。
2.1 运行模式
2.1.1 长模式
AMD64引入了长模式和它的2个子模式:64-bit模式和兼容模式。
64-bit模式 完全支持64位的应用程序和系统软件,本章节将总结为了支持64-bit模式而引入的新特性;开启64-bit模式,需要64位的操作系统和64位的工具链支持。
兼容模式 此模式实现了在64位的操作系统上兼容运行16位/32位X86架构的应用程序,这些应用程序不需要重新编译;本章节将总结为了支持兼容模式而引入的架构增强功能。
不支持的模式 不支持如下2种模式:
Ø 虚8086模式 – 虚8086模式位(EFLAGS.VM)在长模式下被处理器忽略;当长模式使能时,试图开启虚8086模式将自动被处理器忽略,需要进入虚8086模式的系统软件必须先退出长模式。
Ø 实模式 – 进入长模式需要事先开启保护模式,所以长模式下不支持实模式。
2.1.2 传统模式AMD64架构支持纯粹的传统X86模式,此模式二进制兼容16位/32位X86架构应用程序;更进一步地,与兼容模式不同的是,传统模式二进制兼容16位/32位操作系统。传统模式支持实模式、保护模式和虚8086模式。复位时处理器总是处于传统模式(实模式)下,直到系统软件激活长模式。本章将总结为了支持传统模式而增加的新特性。
2.1.3 系统管理模式AMD64架构支持系统管理模式(简称SMM)。SMM可以从长模式或传统模式进入,并能直接返回到长模式或传统模式下。