|
|
@ -203,6 +203,7 @@ Intel 和 IA-32 处理器都是采用“little endian(小端)”方式存储 |
|
|
|
\#GP(0) |
|
|
|
|
|
|
|
# 第二章 Intel 64 and IA-32 Architectures |
|
|
|
|
|
|
|
## 2.1 INTEL® 64 与 IA-32 架构的简要历史 |
|
|
|
|
|
|
|
以下章节提供了从 IA-32 到 Intel 64 架构的主要技术演进的摘要:从 Intel 8086 处理器开始到最新的 Intel®Core®2Duo,Core 2 Quad 和 Intel Xeon 处理器 5300 和 7300 系列。1978 年以前发布的处理器创建的对象代码仍然在 Inter 64 和 IA-32 架构系列中的最新处理器上运行着。 |
|
|
@ -213,13 +214,89 @@ Intel 和 IA-32 处理器都是采用“little endian(小端)”方式存储 |
|
|
|
|
|
|
|
8086/8088 向 IA-32 架构引入了段(segmentation)。通过分段, 16 位段寄存器可以指向高达 64 KB 的内存段。同时使用四个段寄存器,8086/8088 处理器能够不在段之间切换的情况下寻址达 256 KB。使用段寄存器和额外的 16 位指针可以形成的 20 位地址提供 1 MB 的总寻址范围。 |
|
|
|
|
|
|
|
### 2.1.2 Intel® 286 处理器(1982) |
|
|
|
|
|
|
|
Intel 286 处理器向 IA-32 架构中引入了保护模式。保护模式使用段寄存器的内容作为选择器(selector)或指针指向描述符表(descriptor table)。描述符(Descriptor)提供 24 位基址,物理内存可达 16 MB,支持基于段交换的虚拟内存管理,以及一些保护机制。这些机制包括: |
|
|
|
|
|
|
|
* 段限制检查 |
|
|
|
* 只读和只执行段选项 |
|
|
|
* 四种特权级 |
|
|
|
|
|
|
|
### 2.1.3 Intel 386 处理器(1985) |
|
|
|
|
|
|
|
Intel 386 处理器是 IA-32 体系结构家族中的第一个 32 位处理器。它引入了 32 位寄存器用于保存操作数和寻址。每个 32 位 Intel 386 寄存器的低地址保留了早期 16 位寄存器的内容,允许向后兼容。 386 处理器还提供虚拟化 8086 模式,使得在执行 8086/8088 处理器创建的程序时效率更高。 |
|
|
|
|
|
|
|
此外,Intel 386 处理器支持以下功能: |
|
|
|
|
|
|
|
* 32 位地址总线,支持多达 4 GB 物理内存 |
|
|
|
* 段内存模型和一个平面(flat)内存模型 |
|
|
|
* 分页,使用固定的 4 KB 页面大小为虚拟内存管理提供了一种方法 |
|
|
|
* 支持并行级 |
|
|
|
|
|
|
|
### 2.1.4 Intel 486 处理器(1989) |
|
|
|
|
|
|
|
Intel 486 处理器通过将 Intel 386 处理器的指令解码(decode)和执行(execution)扩展到五个流水线步骤,增加了并行执行能力。在不同的执行阶段,每个阶段与其他阶段并行操作,最多可并行执行 5 条指令。 |
|
|
|
|
|
|
|
此外,处理器还增加了: |
|
|
|
|
|
|
|
* 一个 8 KB 芯片一级缓存,增加了在每个时钟上执行指令的数量 |
|
|
|
* 集成 x87 FPU |
|
|
|
* 节能和系统管理能力 |
|
|
|
|
|
|
|
### 2.1.5 The Intel® Pentium® 处理器 (1993) |
|
|
|
|
|
|
|
Intel Pentium processor 的引入增加了第二个执行管道(execution pipeline),以实现超量性能(两个管道,称为 u 和 v,一起可以在每个时钟上执行两条指令)。芯片上的一级缓存增加了一倍,其中 8 KB 用于代码,另外 8 KB 用于数据。除了 Intel 486 处理器使用的透写缓存(write-through cache)外,数据缓存使用 MESI 协议来支持更有效的回写缓存(write-back cache)。为了提高循环结构的性能,增加了带有芯片上分支表的分支预测。 |
|
|
|
|
|
|
|
此外,处理器还增加了: |
|
|
|
|
|
|
|
* 扩展使虚拟 8086 模式更高效,并允许 4MB 和 4KB 页面大小 |
|
|
|
* 128 和 256 位的内部数据路径提速到内部数据传输 |
|
|
|
* 突破性的外部数据总线增加到 64 位 |
|
|
|
* 支持多处理器系统的 APIC |
|
|
|
* 双处理器模式,支持无胶(glueless)双处理器系统 |
|
|
|
|
|
|
|
奔腾系列后续引入了 Intel MMX 技术(带 MMX 技术的奔腾处理器)。INTEL MMX 技术使用单指令,多数据(SIMD)执行模型来并行执行 64 位寄存器中的包装(packed)整数数据。 |
|
|
|
|
|
|
|
参见 2.2.7 节, “SIMD 指令”。(Todo link) |
|
|
|
|
|
|
|
### 2.1.6 - 2.1.22 |
|
|
|
[@翻译人:zhangkai803](https://github.com/zhangkai803) |
|
|
|
|
|
|
|
# 第三章 Basic Execution Environment |
|
|
|
## 3.1 操作模式 |
|
|
|
|
|
|
|
## 3.4 BASIC PROGRAM EXECUTION REGISTERS |
|
|
|
IA-32 架构支持三种基本的运行模式:保护模式、实地址模式和系统管理模式。操作模式决定了哪些指令和架构特性是可用的。 |
|
|
|
|
|
|
|
* **保护模式**(Protected mode)--该模式是处理器的本机状态(native state)。保护模式是指能够在受保护的多任务环境中直接执行实地址模式 8086 软件。这个特性被称为**虚拟-8086 模式**,尽管它实际上不是处理器模式。虚拟-8086 模式实际上是保护模式的一个属性,可以被任何任务开启。 |
|
|
|
|
|
|
|
* **实地址模式**(Real-address mode)-- 该模式实现了 Intel 8086 处理器的编程环境,具有扩展功能(例如切换到保护模式或系统管理模式的能力)。处理器在通电或复位后被置于实地址模式。 |
|
|
|
|
|
|
|
* **系统管理模式** (System management mode,SMM)--该模式为操作系统或执行程序提供透明的机制,实现平台相关特有的功能,如电源管理、系统安全等。当外部 SMM 中断引脚(SMI#--SMM interrupt)被激活或从高级可编程中断控制器(APIC)接收到 SMI 时,处理器进入 SMM。 |
|
|
|
|
|
|
|
在 SMM 中,当保存当前运行的程序或任务的基本上下文时,处理器切换到一个单独的地址空间。然后可以透明地执行特定于 SMM 的代码。当从 SMM 返回时,处理器被放置回系统管理中断之前的状态。SMM 是在 Intel386 SL 和 Intel486 SL 处理器中引入的,并成为奔腾处理器家族的标准 IA-32 特性。 |
|
|
|
|
|
|
|
### 3.1.1 Intel® 64 架构 |
|
|
|
|
|
|
|
Intel 64 架构增加了 IA-32E 模式。IA-32E 模式有两个子模式。他们是: |
|
|
|
|
|
|
|
* 兼容模式(IA-32E 模式的子模式) - 兼容模式允许大多数传统的 16 位和 32 位应用程序在无需重新编译情况下运行在 64 位操作系统。兼容性子模式在 IA-32 架构中简称为兼容模式。兼容模式的执行环境与 3.2 节描述相同。兼容模式还支持 64 位和保护模式支持的所有特权级。以虚拟 8086 模式或使用硬件任务管理的遗留应用程序不能在此模式下工作。 |
|
|
|
|
|
|
|
兼容模式是操作系统在代码段的基础上启用的。这意味着单个 64 位操作系统可以支持以 64 位的应用程序以 64 位模式运行,并支持以兼容模式运行的传统的 32 位应用程序(未重新编译为 64 位)。 |
|
|
|
|
|
|
|
兼容性模式类似于 32 位保护模式。应用程序只访问线性地址空间的前 4 G。兼容模式使用 16 位和 32 位地址和操作数大小。与保护模式一样,这种模式允许应用程序使用 PAE(Physical Address Extensions)访问大于 4 G 的物理内存。 |
|
|
|
|
|
|
|
* 64 位模式(IA 32e 模式的子模式)- 这种模式使 64 位操作系统能够运行访问 64 位地址空间的应用。64 位子模式在 IA-32 架构中简称为 64 位模式。 |
|
|
|
|
|
|
|
64 位模式将通用寄存器和 SIMD 扩展寄存器的数量从 8 升到了 16。并且通用寄存器扩展到 64 位。该模式还引入了一个新的操作码前缀(rex)以访问寄存器的扩展位。有关详细说明,请参见第 3.2.1 节。 |
|
|
|
|
|
|
|
操作系统以代码段为基础启用 64 位模式。其默认地址大小为 64 位,其默认操作数大小为 32 位。可以使用 REX 操作码前缀和操作数大小覆盖前缀在逐条指令的基础上覆盖默认操作数大小。 |
|
|
|
|
|
|
|
REX 前缀允许在 64 位模式下指定 64 位操作数。通过此机制,许多现有指令允许使用 64位寄存器和 64 位地址。 |
|
|
|
|
|
|
|
## 3.4 BASIC PROGRAM EXECUTION REGISTERS |
|
|
|
|
|
|
|
### 3.4.2 段寄存器 |
|
|
|
|
|
|
|
@翻译人:墨 |
|
|
|
|
|
|
|
段寄存器控制(代码段寄存器,数据段寄存器,堆栈段寄存器,扩展段寄存器,标志段寄存器,全局段寄存器)16 位的段选择子。段选择子是一种特殊的指针,用来标识内存中的段。为了访问内存中特定的段,该段的段选择子必须存在于适当的段寄存器中。 |
|
|
@ -275,11 +352,56 @@ CS , DS , SS 和 ES 这四个段寄存器与 Intel 8086 and Intel 286 处理器 |
|
|
|
|
|
|
|
@翻译人:符宇舟Alex |
|
|
|
|
|
|
|
## 4.4 BIT FIELD DATA TYPE |
|
|
|
[@翻译人:Hola39e](https://github.com/Hola39e) |
|
|
|
|
|
|
|
位域数据类型(见图4-6)是一个连续的比特序列。它可以从内存中任何字节的任何位开始,最多可以包含32位。 |
|
|
|
|
|
|
|
Figure 4-6 here |
|
|
|
## 4.5 STRING DATA TYPES |
|
|
|
[@翻译人:Hola39e](https://github.com/Hola39e) |
|
|
|
|
|
|
|
字符串数据类型是比特、字节、字或双字的连续序列。一个比特串可以从任何字节的任何比特位置开始,并且可以包含最多$2^{32}-1$个比特。一个字节串可以包含字节、字或双字,并且长度范围可以包含从0到$2^{32}-1$个字节(4GB)。 |
|
|
|
|
|
|
|
## 4.6 PACKED SIMD DATA TYPES |
|
|
|
[@翻译人:Hola39e](https://github.com/Hola39e) |
|
|
|
|
|
|
|
Intel64和IA-32架构定义与操作一组64位和128位包装(Packed)数据类型,中文又称数据向量,用于单指令多数据流(SIMD)操作。这些打包数据类型的由基本的数据类型(打包对齐的字节、字、双字和四字组成),以及用于进行矢量运算(Packed)指令操作的整数,浮点数基本类型的数值说明。 |
|
|
|
### 4.6.1 64-Bit SIMD Packed Data Types |
|
|
|
[@翻译人:Hola39e](https://github.com/Hola39e) |
|
|
|
|
|
|
|
64位包装(Packed)SIMD数据结构是在Intel MXX指令集中加入到IA-32中去的。它们在MXX寄存器中被操作。基本的64位包装数据类型是打包对齐起来的字节、字以及双字(见图4-7)。当执行SIMD操作时,这些数据结构会被解释成 |
|
|
|
进行矢量运算(Packed)指令操作的字节、字、双字长度的整数值。 |
|
|
|
|
|
|
|
Figure 4-7 here |
|
|
|
|
|
|
|
### 4.6.2 128-Bit Packed SIMD Data Types |
|
|
|
[@翻译人:Hola39e](https://github.com/Hola39e) |
|
|
|
|
|
|
|
128位包装(Packed)SIMD数据结构是在SSE扩展指令集中被引入到IA-32中去的,在SSE2,SSE3,SSSE3扩展指令集中被使用。它们主要在128位的XMM寄存器和内存中进行操作,基本的128位包装数据类型是打包对齐起来的字节、字、双字、四字组成的(见图4-8)。当对在XMM寄存器中保存的包装(Packed)数据类型执行SIMD操作时,这些数据类型会被解释进行矢量运算(Packed)指令操作或标量运算(Scalar)指令操作的单精度浮点数或双精度浮点数,或者进行矢量运算(Packed)的长度为字节、字、双字、四字的整数值。 |
|
|
|
|
|
|
|
Figure 4-8 here |
|
|
|
# 第五章 Instruction Set Summary |
|
|
|
|
|
|
|
# 第六章 Procedure Calls, Interrupts, and Exceptions |
|
|
|
|
|
|
|
## 6.3 CALLING PROCEDURES USING CALL AND RET |
|
|
|
|
|
|
|
### 6.3.1 Near CALL and RET Operation |
|
|
|
|
|
|
|
@翻译人:si |
|
|
|
|
|
|
|
### 6.3.2 Far CALL and RET Operation |
|
|
|
|
|
|
|
@翻译人:si |
|
|
|
|
|
|
|
## 6.4 INTERRUPTS AND EXCEPTIONS |
|
|
|
|
|
|
|
### 6.4.1 Call and Return Operation for Interrupt or Exception Handling Procedures |
|
|
|
|
|
|
|
@翻译人:si |
|
|
|
|
|
|
|
|
|
|
|
# 第七章 Programming With General-Purpose Instructions |
|
|
|
|
|
|
|
# 第八章 ~ 第十八章 |
|
|
|