Intel处理器手册系统编程指南第2章(1)

第2章系统架构概观

IA-32架构(从Intel386处理器系列开始)为系统软件提供了额外的支持。这个额外的支持提供多种操作模式,包括:

  • 实模式、保护模式、虚拟8086模式和系统管理模式。这些有时被称为“传统模式”。

Intel 64 架构支持几乎所有IA-32架构支持的系统编程功能,而且还拓展了一个支持64位编程环境的新的操作模式(IA-32e模式)。IA-32e模式允许软件在以下任一子模式中运行:

  • 64位模式,支持64位的操作系统和应用程序
  • 兼容模式,允许大多数传统的软件运行;它与64位操作系统下的64位应用软件共存

IA-32部署并包含支持以下操作的特性:

  • 内存管理
  • 系统模块的保护
  • 多任务
  • 异常和中断的处理
  • 多处理器
  • 缓存管理
  • 硬件资源和电源管理
  • 调试和性能监视

这一章提供对这架构的每一方面的描述。它还描述在系统级别用来建立和控制处理器的系统寄存器,并且给出系统级的处理器指令的简要概况。

很多系统级架构的特性只会被系统软件程序员用到,但应用软件程序员也可能需要阅读这一章和下一章来为应用程序建立一个可靠安全的(运行)环境。

这个概述和大多数后续的章节专注于IA-32架构的保护模式的操作。Intel 64架构下IA-32e模式的操作由于跟保护模式的不同,也会被介绍到。

所有Intel 64和IA-32的处理器在加电或者复位后进入实际地址模式。然后软件开始从实模式转换到保护模式。如果要用到IA-32e模式的操作,软件还要从保护模式转换到IA-32e模式。

2.1 系统级架构的概述

系统级架构包括一系列的用于支持基本的系统级操作(如内存管理、中断与异常处理、任务管理、多处理器控制)的寄存器、数据结构和指令。

图2-1展示了32位模式的系统寄存器和数据结构的概况。图2-2则展示了IA-32e模式的系统寄存器和数据结构。

2.1.1 全局和局部描述符表

当在保护模式中操作时,如图2-1所示,所有的内存访问要不经过全局描述符表(Global Descriptor Table,简称GDT),要不经过某个局部描述符表(Local Descriptor Table,简称LDT)。这些描述符表包含称为“段描述符”的入口。段描述符提供段的基础地址和访问权限、段的类型与作用等信息。

每个段描述符有一个相应的段选择子。一个段选择子给调用它的软件提供指向全局描述符表或者局部描述符表的索引(它的相应的段描述符的偏移)、一个全局或局部的标志(决定选择子指向GDT还是LDT)和访问权限信息。

要访问一个段里的数据,必须提供一个段选择子和一个偏移量。段选择子提供对GDT或LDT中该段的段描述符的访问。从段描述符那里,处理器得到段在线性地址空间中的基础地址。偏移量提供数据相对基础地址的位置。只要在现在特权级(Current Privilege Level,简称CPL)下该段是可访问的,这种机制适用于访问任意的有效的代码、数据或者堆栈段。CPL的定义是现在运行中代码的代码段的保护层级别。

看到图2-1,实线箭头指向的是线性地址,虚线箭头指向的是段选择子,而点状线箭头指向一个物理地址。为了简单起见,许多段选择子被直接指向一个段。但实际的从段选择子到相应的段的路径总是通过一个GDT或者LDT。

GDT的基址的线性地址存放在GDT寄存器(GDTR)中,LDT的基址的线性地址存放在LDT寄存器(LDTR)中。


图2-1、IA-32系统级寄存器和数据结构

图2-2、IA-32e模式下的系统级寄存器和数据结构

 

2.1.1.1IA-32e模式下的全局和局部描述符表

在IA-32e模式下,GDTR和LDTR两个寄存器都是64位的。更多详细信息请见章节3.5.2《IA-32e模式下的段描述符表》

在64位模式中,全局和局部描述符表也被拓展以支持64位的基础地址,(16字节(128位)的局部描述符包含一个64位的基础地址和一些属性)。在兼容模式中,描述符表不被拓展。

2.1.2 系统段、段描述符和门

除了组成程序运行环境的代码段、数据段和堆栈段,架构规定了两个系统段:任务状态段(Task-State Segment,简称TSS)和LDT。GDT不被看作一个段,因为它不是通过段选择子和段描述符被访问。TSS和LDT有为它们规定的段描述符。

架构还规定了一系列特殊的称为“门”的描述符(调用门、中断门、陷阱门和任务门)。这些门为应用程序和大多数过程提供调用系统过程和系统处理例程的入口。例如,调用一个调用门可以访问一个在更底层特权级(更优特权)的代码段的过程。要通过一个调用门来访问一个过程,提出调用的过程要提供该调用门的选择子。然后处理器进行CPL、调用门的特权级和目标代码段的特权级的比较。

如果对目标代码段的访问被允许,处理器从调用门得到目标代码段的段选择子和偏移量。如果调用需要特权级的改变,处理器还会切换到目标特权级的堆栈。新堆栈的段选择子从现在运行中任务的任务状态段(TSS)获得。门还能用来进行16位和32位代码段的相互切换。

2.1.2.1 IA-32e模式下的门

在IA-32e模式下,以下这些描述符是16字节(128位)的,拓展以容纳64位的基址:LDT描述符、64位TSS、调用门、中断门和陷阱门。

调用门可用于64位模式和兼容模式的相互转换。任务们不支持IA-32e模式。在特权级改变时,堆栈段选择子不从TSS得到,而它们会被设为NULL。


2.1.3 任务状态段和任务门

TSS规定了一个任务的运行环境的状态。它包括通用寄存器(general-purpose registers)、段寄存器、标志寄存器(EFLAGSregister),EIP寄存器和包含三个堆栈段(每个对应一个特权级)的指针的段选择子。TSS还包括对应任务的LDT的段选择子和分页结构的层次。

所有在保护模式下的程序运行在一个任务(称为“当前任务”)的环境下。当前任务的TSS的段选择子储存在任务寄存器里。最简单的切换任务的方法就是执行一个到新任务的调用或跳转。在此,新任务的TSS的段选择子在CALL或JMP指令中给出。在任务转换时,处理器执行下列操作:

1、储存当前任务的状态在当前的TSS中。

2、加载新任务的段选择子到任务寄存器。

3、通过GDT中的一个段描述符访问新的TSS。

4、从新的TSS加载通用寄存器、段寄存器、LDTR、控制寄存器CR3(分页结构层次的基础地址)、EFLAGS寄存器和EIP寄存器的状态。

5、开始执行新任务。

还可通过一个任务门来访问一个任务。任务门跟调用门是类似的,除了任务门提供对一个TSS的访问(通过一个段描述符)而调用门提供对一个代码段的访问。

2.1.3.1 IA-32e模式下的任务状态段

硬件任务切换在IA-32e模式下不被支持。但是,TSS仍继续存在。TSS的基础地址由其描述符指定。

一个64位的TSS包括对64位操作重要的以下信息:

  • 对应每个特权级的堆栈指针地址
  • 中断堆栈表的指针地址
  • IO许可位图相对TSS基址的偏移地址

在IA-32e模式中,任务寄存器被拓展以存放64位的基础地址。请看章节7.7,《64位模式中的任务管理》。


2.1.4 中断与异常处理

外部中断、软件中断和异常通过中断描述符表(Interrupt Descriptor Table,简称IDT)被处理。IDT存放一系列提供对中断与异常处理例程的访问的门描述符。与GDT一样,IDT不是一个段。IDT的基址的线性地址存放在IDT寄存器(IDTR)中。

IDT中的门描述符可以是中断门、陷阱门或者任务门的描述符。要访问一个中断或异常处理例程,处理器首先得到一个中断向量(中断号码),从内部硬件或外部中断控制器,或从软件的INT、INTO、INT 3或BOUND指令)。中断向量提供进入IDT的一个索引。如果被选择的门描述符是一个中断门或一个陷阱门,相应的处理例程就会被访问,类似于通过一个调用门访问一个过程。如果该描述符是一个任务门,处理例程会通过一个任务切换被访问。

2.1.4.1 IA-32e模式下的中断与异常处理

在IA-32e模式下,中断描述符被拓展到16字节(128位)以支持64位的基础地址。这在64位模式和兼容模式下都适用。

IDTR寄存器被拓展以存放64位的基础地址。任务门不被支持。


2.1.5 内存管理

系统架构支持直接访问内存的物理地址或虚拟内存(通过分页机制)。当使用物理地址时,线性地址被看作物理地址。当使用分页机制时,所有代码、数据、堆栈和系统段(包括GDT和IDT)可被分页到物理内存中最近被访问的页面中。

页面在物理内存中的位置(有时被称作“页帧”)包含在分页结构中。这些结构驻留在物理内存中(32位分页的情况请看图2-1)。

分页结构层次的基础物理地址包含在控制寄存器CR3中。分页结构的入口决定页帧的基址的物理地址、访问权限和内存管理信息。

要使用这种分页机制,线性地址会被分割成许多部分。这些部分提供各自的指向分页结构和页帧的偏移量。一个系统可以只有一个分页结构层次或者多个。例如,每个任务可以有它独立的层次。

2.1.5.1 IA-32e模式下的内存管理

在IA-32e模式下,物理内存页面被一系列的系统数据结构管理。在兼容模式和64位模式下,4个层次的系统数据结构被用到,他们是:

  • 第4级页表(Page MapLevel 4,简称PML4)——PML4表中的一个入口包含一个分页目录指针表的基址的物理地址、访问权限和内存管理信息。PML4的基址物理地址存放在CR3寄存器中。
  • 一系列分页目录指针表——分页目录指针表中的一个入口包含一个分页目录表的基址的物理地址、访问权限和内存管理信息。
  • 分页目录的集合——分页目录表中的一个入口包含一个页表的基址的物理地址、访问权限和内存管理信息。
  • 页表的集合——页表中的一个入口包含一个页帧的基址的物理地址、访问权限和内存管理信息。

2.1.6 系统寄存器

为了帮助初始化处理器和控制系统操作,系统架构在EFLAGS寄存器和系统寄存器中提供了一些系统标志:

  • EFLAGS寄存器中的系统标志和IOPL域控制任务和模式的转换、中断处理、指令跟踪和访问权限。请参考章节2.3,《EFLAGS寄存器中的系统标志和域》。
  • 控制寄存器(CR0、CR2、CR3、CR4)包含了一些控制系统级操作的标志和数据域。这些寄存器中的其他标志用来指示对特定的处理器功能的支持。请参考章节2.5,《控制寄存器》。
  • 调试寄存器(不在图2-1中)允许调试程序和系统软件时设置断点。请参考第17章,《调试,分支?和时间?计数器》(Branch Profiling, and Time-Stamp Counter)
  • GDTR、LDTR和IDTR寄存器存放相应描述符表的线性地址和大小(界限)。请参考章节2.4,《内存管理寄存器》。
  • 任务寄存器存放当前任务的TSS的线性地址和大小。请参考章节2.4,《内存管理寄存器》。
  • 特定模型寄存器(不在图2-1中)。

特定模型寄存器(Model-Specific Register,简称MSR)是一组主要给系统代码(运行在0级特权级的代码)使用的寄存器。这些寄存器控制诸如调试范围、性能监视计数器、机器检查架构和内存类型范围(Memory Type Ranges,简称MTRs)等项目。

这些寄存器的数量和功能在不同的Intel 64和IA-32处理器系列上不尽相同。请看章节9.4,《特定模型寄存器》和第34章,《特定模型寄存器》。

大多数系统限制应用程序对系统寄存器(除了EFLAGS)的访问。但系统也可以这样设计,让所有的程序和过程都运行在最优特权级(0级)。在这样的情况下,应用程序将可以修改系统寄存器。

2.1.6.1 IA-32e模式下的系统寄存器

在IA-32e模式下,四个系统描述符表寄存器(GDTR、IDTR、LDTR和TR)都被硬件拓展以存放64位的基础地址。EFLAGS变成了64位的RFLAGS寄存器。CR0-CR4都被拓展到64位。CR8可被使用。CR8提供对任务优先级寄存器(Task Priority Register,简称TDR)的读写访问,以使操作系统可以控制外部中断的优先等级。

在64位模式下,调试寄存器DR0-DR7是64位的。在兼容模式下,DR0-DR3中的地址匹配仍然工作在64位粒度。

在支持IA-32e模式的系统中,额外特性使能寄存器(IA32_EFER)是可用的。这个特定模式的寄存器控制IA-32e模式和其他IA-32e模式的操作。另外还有几个特定模式寄存器控制IA-32e模式的指令:

  • IA32_KernelGSbase——被SWAPGS指令使用
  • IA32_LSTAR——被SYSCALL指令使用
  • IA32_SYSCALL_FLAG_MASK——被SYSCALL指令使用
  • IA32_STAR_CS——被SYSCALL和SYSRET指令使用

2.1.7 其他系统资源

除了前一节所说的系统寄存器和数据结构,系统架构还提供了以下的额外资源:

  • 操作系统指令(请见:2.7《系统指令总结》)。
  • 性能监视计数器(没在图2-1中画出)。
  • 内部缓存、缓冲区(没在图2-1中画出)。

性能监视计数器是能被编程为记录处理器事件的事件计数器。这些处理器事件可以是译码指令数、接收中断数、缓存负荷量等。请见第23章《虚拟机拓展概述》。

处理器提供了一些内部缓存、缓冲区。缓存可以用来储存数据或指令。缓冲区用来存放已翻译的段地址和准备执行的操作。请见第11章《内存缓存控制》。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值