文章目录
- 前言
- 一、IA-32 架构 和 Intel 64 架构 简述
- 二、系统级架构概述
- 2.1 Global and Local Descriptor Tables
- 2.1.1 32-bit modes
- 2.1.2 IA-32e Mode
- 2.2 System Segments, Segment Descriptors, and Gates
- 2.2.1 32-bit modes
- 2.2.2 IA-32e Mode
- 2.3 Task-State Segments and Task Gates
- 2.3.1 32-bit modes
- 2.3.2 IA-32e Mode
- 2.4 Interrupt and Exception Handling
- 2.4.1 32-bit modes
- 2.4.2 IA-32e Mode
- 2.5 Memory Management
- 2.5.1 32-bit modes
- 2.5.2 IA-32e Mode
- 2.6 System Registers
- 2.6.1 32-bit modes
- 2.6.2 IA-32e Mode
- 2.7 Other System Resources
- 总结
前言
今天开始翻译Intel手册的官方文档,主要是 Intel vol3手册,有些英文单词翻译成中文别扭的我会保留英文,不翻译。
刚开始只翻译自己感兴趣的章节,并且有的地方我不会翻译,同时也会结合Linux和自己的一点点理解。
本文主要参考了Intel vol3 chater 2.2.1章节。
一、IA-32 架构 和 Intel 64 架构 简述
IA-32 架构(从 Intel386 处理器系列开始)为操作系统和系统开发软件提供广泛支持。这种支持提供了多种操作模式,包括:实模式、保护模式、 virtual 8086 mode、系统管理模式。 这些有时被称为传统模式。
Intel 64 架构支持几乎所有 IA-32 架构中可用的系统编程工具,并将它们扩展到支持 64 位编程环境的新操作模式(IA-32e 模式:其中的e是extend 扩展的意思)。IA-32e 模式允许软件以两种子模式之一运行:
(1)64-bit mode:支持 64 位操作系统和 64 位应用程序
(2)Compatibility mode:允许大多数旧版软件运行; 它与 64 位操作系统下的 64 位应用程序共存。
IA-32 系统级架构包括有助于以下操作的功能:
(1)内存管理 (Memory management)
(2)软件模块保护 (Protection of software modules)
(3)多任务处理 (Multitasking)
(4)异常和中断处理 (Exception and interrupt handling)
(5)多处理器 (Multiprocessing)
(6)缓存管理 (Cache management)
(7)硬件资源和电源管理 (Hardware resource and power management)
(8)调试和性能监控 (Debugging and performance monitoring)
该系列文章会描述该架构的每个部分,它还描述了用于在系统级别设置和控制处理器的系统寄存器,并简要概述了处理器的系统级别(操作系统)指令。
系统级架构的许多特性仅供系统程序员使用。 然而,应用程序员可能需要了解这些特性才能创建可靠且安全的应用程序的环境。
本文章和后续的与此有关的文章都集中在 IA-32 架构的保护模式操作,还描述了 Intel 64 架构的 IA-32e 模式操作,因为它不同于保护模式操作。
所有 Intel 64 和 IA-32 处理器在上电或复位后进入实地址模式,然后软件启动从实地址模式到保护模式的切换,如果需要 IA-32e 模式操作,软件还会启动从保护模式到 IA-32e 模式的切换。
二、系统级架构概述
系统级体系结构由一组寄存器、数据结构和指令组成,为了支持基本的系统级操作:如内存管理、中断和异常处理、任务管理和多处理器控制。
(1)下图是 32-bit modes( IA-32 架构) 的系统寄存器和数据结构:
(2)下图为 IA-32e mode ( Intel 64 架构)的系统寄存器和数据结构:
部分短语在下文出现的很频繁,先简单介绍以下:
segment descriptor :段描述符。
segment selector:段选择子。
offest :偏移量。
global descriptor table (GDT) :全局描述符表。
local descriptor table (LDT):局部描述符表。
interrupt descriptor table (IDT):中断描述符表。
current privilege level (CPL):当前特权级别。
task-state segment (TSS):任务状态段。
2.1 Global and Local Descriptor Tables
2.1.1 32-bit modes
从上图中我们可以看到:在保护模式下操作时,所有内存访问都通过GDT 或可选的LDT,这些表包含称为段描述符的条目。段描述符提供段的基地址以及访问权限、类型和使用信息。
每个段描述符都有一个关联的段选择子。段选择子为使用它的软件提供 GDT 或 LDT 的索引(其关联的段描述符的偏移量)、全局/本地标志(确定选择子是指向 GDT 还是 LDT)、以及访问权限信息。
要访问段中的字节,必须提供段选择子和偏移量。段选择子提供对段的段描述符的访问 (GDT or LDT),
处理器从段描述符中获得该段在线性地址空间中的基地址,然后偏移量提供了相对于基地址的字节。这种机制可用于访问任何有效的代码、数据或堆栈段,前提是可以从处理器运行的当前特权级别 (CPL) 访问该段。CPL 定义为当前执行代码段的保护级别。
上图中的实箭头(solid arrows)表示一个线性地址,虚线( dashed lines,这里我觉得还是一个虚线箭头,Intel 手册这里让我不能理解)表示段选择子,虚线箭头( dotted arrows)表示物理地址,我仔细看了上图只有CR3寄存器那里表示物理地址,CR3寄存器存储的是页目录(或者页全局目录)的物理地址。其它的虚线箭头都是表示段选择子。
为简单起见,许多段选择子显示为指向段的直接指针,但是,从段选择子到其相关联段的实际路径总是会通过 GDT 或 LDT。
GDT 线性基地址包含在 GDT 寄存器(GDTR)中; LDT 的线性基地址包含在 LDT 寄存器 (LDTR) 中。
2.1.2 IA-32e Mode
GDTR 和 LDTR 寄存器在 IA-32e 两种子模式(64-bit mode 和 compatibility mode)中都扩展为 64 位位宽。
(1)64-bit mode:全局和局部描述符表扩展为支持 64 位基地址,16字节LDT描述符包含64位基址和各种属性。
(2)compatibility mode:描述符没有被扩展。
2.2 System Segments, Segment Descriptors, and Gates
2.2.1 32-bit modes
除了构成程序或过程执行环境的代码、数据和堆栈段,体系结构定义了两个系统段:TSS和LDT。GDT 不被视为一个段,因为它不是通过段选择子和段描述符访问的。TSS 和 LDT 具有为它们定义的段描述符。
该架构还定义了一组称为门的特殊描述符(调用门、中断门、陷阱门和任务门)。它们为系统过程和处理程序提供受保护的通道,这些过程和处理程序可能在与应用程序和大多数过程不同的特权级别上运行,例如,调用门的CALL可以提供对与当前代码段数值上特权级别相同或在数值上特权级别较低(特权级别更高)的代码段中的过程的访问。为了通过调用门访问过程,调用过程为调用门提供选择子,处理器然后对调用门执行访问权限检查,将 CPL 与调用门的特权级别和调用门指向的目标代码段进行比较。
如果允许访问目标代码段,则处理器获取目标代码段的段选择子以及从调用门到该代码段的偏移量。如果调用需要更改特权级别,处理器也会切换到目标特权级别的堆栈。新堆栈的段选择子是从当前运行任务的 TSS 中获得的。门还促进 16 位和 32 位代码段之间的转换,反过来也是。
备注:
过程( procedure):通常用作逻辑单元或代码块(例如程序、过程、函数或例程)的通用术语。
2.2.2 IA-32e Mode
在 IA-32e mode下,以下描述符是 16 字节描述符(扩展为允许 64 位基址):LDT 描述符、64 位 TSS、调用门、中断门和陷阱门。调用门促进 64 位模式和兼容模式之间的转换。 IA-32e 模式不支持任务门,在特权级别更改时,不会从 TSS 中读取堆栈段选择子,相反,它们被设置为 NULL。
2.3 Task-State Segments and Task Gates
2.3.1 32-bit modes
TSS 定义了任务的执行环境的状态,它包括通用寄存器、段寄存器、EFLAGS 寄存器、EIP 寄存器和带有三个堆栈段的堆栈指针的段选择子的状态(每个特权级别一个堆栈)。TSS 还包括与任务关联的 LDT 的段选择子和分页结构层次结构的基地址。
保护模式下的所有程序执行都发生在任务(称为当前任务)的上下文中。当前任务的 TSS 段选择子存储在任务寄存器中。切换到任务最简单的方法是调用或跳转到新任务,新任务的 TSS 的段选择子在 CALL 或 JMP 指令中给出。在切换任务中,处理器执行以下动作:
(1)将当前任务的状态存储在当前TSS中。
(2)加载任务寄存器与段选择子的新任务。
(3)通过GDT中的段描述符访问新的TSS。
(4)将新任务的状态从新的TSS加载到通用寄存器、段寄存器、LDTR、控制寄存器CR3(分页结构层次结构的基址)、EFLAGS寄存器和EIP寄存器。
(5)开始执行新任务。
也可以通过任务门访问任务。 任务门类似于调用门,任务门类似于调用门,只是它提供对TSS的访问(通过段选择子),而不是代码段。
2.3.2 IA-32e Mode
IA-32e 模式不支持硬件任务切换( Hardware task switches)。 但是,TSS 继续存在。 TSS 的基地址由其描述符指定。
64 位 TSS 包含以下对 64 位操作很重要的信息:
(1)每个特权级别的堆栈指针地址。
(2)中断堆栈表的指针地址。
(3)IO 权限位图的偏移地址(from the TSS base)。
任务寄存器扩展为在 IA-32e 模式下保存 64 位基地址。
2.4 Interrupt and Exception Handling
2.4.1 32-bit modes
外部中断、软件中断和异常通过IDT处理,IDT存储了一组gate描述符,这些描述符提供对中断和异常处理程序的访问。与 GDT 一样,IDT 不是一个段。IDT 的线性基地址包含在 IDT 寄存器 (IDTR) 中。
IDT中的门描述符可以是中断、陷阱或任务门描述符。为了访问中断或异常处理程序,处理器首先通过INT n、INTO、INT3、INT1或BOUND指令从内部硬件、外部中断控制器或软件接收一个中断向量。中断向量提供了IDT的索引。如果所选门描述符是中断门或陷阱门,则以类似于调用过程的方式访问相关的处理程序过程。如果描述符是任务门,则通过任务开关访问处理程序。
2.4.2 IA-32e Mode
在IA-32e模式下,中断门描述符被扩展到16字节,以支持64位基址。对于64位模式和兼容性模式,这是正确的。
IDTR 寄存器扩展为保存 64 位基地址,不支持任务门。
2.5 Memory Management
2.5.1 32-bit modes
系统架构支持内存的直接物理寻址或虚拟内存(通过分页)。当使用物理寻址时,线性地址被视为物理地址。使用分页时:可以对所有代码、数据、堆栈和系统段(包括 GDT 和 IDT)进行分页,只有最近访问的页面保存在物理内存中。
页(有时称为页框)在物理内存中的位置包含在分页结构中,这些结构保存在物理内存中。
分页结构层次的物理基地址包含在控制寄存器 CR3 中,分页结构中的条目确定页框基地址的物理地址、访问权限和内存管理信息。
为了使用这种分页机制,线性地址被分成几部分。这些部分为分页结构和页框提供了单独的偏移量。系统可以有一个或多个分页结构的层次结构。例如,每个任务都可以有自己的层次结构。
2.5.2 IA-32e Mode
在 IA-32e 模式下,物理内存页由一组系统数据结构管理,在兼容模式和 64 位模式下,都使用了四级或五级系统数据结构,其中包括:
(1)The page map level 5 (PML5):PML5 表中的条目包含 PML4 table的物理基地址、访问权限和内存管理信息。
(2)A page map level 4 (PML4):PML4 表中的条目包含page directory pointer table的物理基地址、访问权限和内存管理信息。对于4级分页,只有一个PML4表,它的物理基地址存储在CR3中。
(3)A set of page directory pointer tables :page directory pointer table 的条目包含page directory table的物理基地址、访问权限和内存管理信息。
(4)Sets of page directories: page directory table 中的条目包含 page table 的物理基地址、访问权限和内存管理信息。
(5)Sets of page tables: page table 中的条目包含页框的物理地址、访问权限和内存管理信息。
2.6 System Registers
2.6.1 32-bit modes
为了帮助初始化处理器和控制系统操作,系统架构在 EFLAGS 寄存器和几个系统寄存器中提供了系统标志:
(1)EFLAGS 寄存器中的系统标志和 IOPL 字段控制任务和模式切换、中断处理、指令跟踪和访问权限。
(2)控制寄存器(CR0、CR2、CR3和CR4)包含各种标志和数据字段,用于控制系统级操作。这些寄存器中的其他标志用于表示对操作系统或执行程序中特定处理器功能的支持。
(3)调试寄存器(上图没有显示)允许设置断点以用于调试程序和系统软件。
(4)GDTR、LDTR 和 IDTR 寄存器包含它们各自表的线性地址和大小(限制)。
(5)任务寄存器包含当前任务的TSS的线性地址和大小。
(6)Model-specific registers(上图未显示)是一组主要可用于操作系统或执行过程(即以特权级别 0 运行的代码)的寄存器。
这些寄存器控制比如调试扩展、性能监视计数器、机器检查体系结构和内存类型范围 (MTRRs)等条目。这些寄存器的数量和功能在Intel 64和IA-32处理器家族的不同成员中而有所不同。
大多数系统限制应用程序对系统寄存器(除了EFLAGS寄存器)的访问。但是,可以将系统设计为所有程序和过程运行在最高特权级别(特权级别0)。在这种情况下,应用程序将被允许修改系统寄存器。
2.6.2 IA-32e Mode
在 IA-32e 模式中,四个系统描述符表寄存器(GDTR、IDTR、LDTR 和 TR)在硬件中扩展为保存 64 位基地址。 EFLAGS 成为 64 位 RFLAGS 寄存器。 CR0–CR4 扩展为 64 位,CR8 寄存器是可用的。 CR8 提供对任务优先级寄存器 (TPR: task priority register) 的读写访问,以便操作系统可以控制外部中断的优先级。
在64位模式下,调试寄存器DR0-DR7是64位。在兼容性模式下,DR0-DR3 中的地址匹配( address-matching)也是以 64 位粒度(64-bit granularity)完成的。
在支持IA-32e模式的系统上,扩展特性使能寄存器(IA32_EFER)是可用的,该MSR寄存器控制 IA-32e 模式和其他 IA-32e 模式操作的激活。此外,还有几个MSR寄存器控制 IA-32e 模式指令:
(1)IA32_KERNEL_GS_BASE : Used by SWAPGS instruction.
(2)IA32_LSTAR :Used by SYSCALL instruction.
(3)IA32_FMASK : Used by SYSCALL instruction.
(4)IA32_STAR : Used by SYSCALL and SYSRET instruction
2.7 Other System Resources
除了前面介绍的系统寄存器和数据结构外,系统架构还提供了以下额外资源:
(1)操作系统指令 (Operating system instructions)。
(2)性能监视计数器 (Performance-monitoring counters)。
(3)内部缓存和缓冲区 (Internal caches and buffers)。
性能监控计数器是事件计数器,可以通过编程对处理器事件进行计数,例如 instructions decoded 事件的数目、 interrupts received 事件的数目或 cache loads 事件的数目。
处理器提供了几个内部缓存和缓冲区。缓存用来存储数据和指令。缓冲区用于存储诸如系统和应用程序段的解码地址以及等待执行的写操作之类的东西。
总结
该章节主要是对Intel IA-32 架构 和 Intel 64 架构 的一个简单概述,后面还会详细介绍各个子模块,并且结合Linux内核源码来进行讲解。