翻译前先阅读整体规则的 [README](https://github.com/sunym1993/flash-linux0.11-talk/blob/main/Intel%20%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E7%89%88/README.md) 哟~
# 目录
这里是目录,要有锚点链接。
[@翻译人:闪客sun](https://github.com/sunym1993/flash-linux0.11-talk)
本卷是讲述 Intel 64 和 IA-32 架构处理器体系结构和编程环境的一部分,其他卷分别是:
- [卷二:指令集参考](https://github.com/sunym1993/flash-linux0.11-talk/blob/main/Intel%20手册中文版/卷二:指令集参考.md)
- [卷三:系统编程指南](https://github.com/sunym1993/flash-linux0.11-talk/blob/main/Intel%20手册中文版/卷三:系统编程指南.md)
- [卷四:特殊模块寄存器(MSR)](https://github.com/sunym1993/flash-linux0.11-talk/blob/main/Intel%20手册中文版/卷四:特殊模块寄存器(MSR).md)
卷一描述了处理器的基本架构和编程环境;卷二描述了处理器的指令集和操作码(opcode)结构;卷三描述了处理器的操作系统支持环境,主要针对操作系统和 BIOS 的设计;卷四描述了处理器的 MSR 寄存器。
## 1.1 支持的处理器型号
本手册包含了最新的 Intel 64 和 IA-32 处理器,如下:
```
- Pentium® processorsP6 family processors
- Pentium® 4 processors
- Pentium® M processors
- Intel® Xeon® processors
- Pentium® D processors
- Pentium® processor Extreme Editions
- 64-bit Intel® Xeon® processors
- Intel® Core™ Duo processor
- Intel® Core™ Solo processor
- Dual-Core Intel® Xeon® processor LV
- Intel® Core™2 Duo processor
- Intel® Core™2 Quad processor Q6000 series
- Intel® Xeon® processor 3000, 3200 series
- Intel® Xeon® processor 5000 series
- Intel® Xeon® processor 5100, 5300 series
- Intel® Core™2 Extreme processor X7000 and X6800 series
- Intel® Core™2 Extreme processor QX6000 series
- Intel® Xeon® processor 7100 series1-2Vol. 1ABOUT THIS MANUAL
- Intel® Pentium® Dual-Core processor
- Intel® Xeon® processor 7200, 7300 series
- Intel® Xeon® processor 5200, 5400, 7400 series
- Intel® Core™2 Extreme processor QX9000 and X9000 series
- Intel® Core™2 Quad processor Q9000 series
- Intel® Core™2 Duo processor E8000, T9000 series
- Intel® Atom™ processor family
- Intel® Atom™ processors 200, 300, D400, D500, D2000, N200, N400, N2000, E2000, Z500, Z600, Z2000, C1000 series are built from 45 nm and 32 nm processes
- Intel® Core™ i7 processor
- Intel® Core™ i5 processor
- Intel® Xeon® processor E7-8800/4800/2800 product families
- Intel® Core™ i7-3930K processor
- 2nd generation Intel® Core™ i7-2xxx, Intel® Core™ i5-2xxx, Intel® Core™ i3-2xxx processor series
- Intel® Xeon® processor E3-1200 product family
- Intel® Xeon® processor E5-2400/1400 product family
- Intel® Xeon® processor E5-4600/2600/1600 product family
- 3rd generation Intel® Core™ processors
- Intel® Xeon® processor E3-1200 v2 product family
- Intel® Xeon® processor E5-2400/1400 v2 product families
- Intel® Xeon® processor E5-4600/2600/1600 v2 product families
- Intel® Xeon® processor E7-8800/4800/2800 v2 product families
- 4th generation Intel® Core™ processors
- The Intel® Core™ M processor family
- Intel® Core™ i7-59xx Processor Extreme Edition
- Intel® Core™ i7-49xx Processor Extreme Edition
- Intel® Xeon® processor E3-1200 v3 product family
- Intel® Xeon® processor E5-2600/1600 v3 product families
- 5th generation Intel® Core™ processors
- Intel® Xeon® processor D-1500 product family
- Intel® Xeon® processor E5 v4 family
- Intel® Atom™ processor X7-Z8000 and X5-Z8000 series
- Intel® Atom™ processor Z3400 series
- Intel® Atom™ processor Z3500 series
- 6th generation Intel® Core™ processors
- Intel® Xeon® processor E3-1500m v5 product family
- 7th generation Intel® Core™ processors
- Intel® Xeon Phi™ Processor 3200, 5200, 7200 Series
- Intel® Xeon® Processor Scalable Family
- 8th generation Intel® Core™ processors
- Intel® Xeon Phi™ Processor 7215, 7285, 7295 Series
- Intel® Xeon® E processors
- 9th generation Intel® Core™ processors
- 2nd generation Intel® Xeon® Processor Scalable Family Vol. 11-3ABOUT THIS MANUAL
- 10th generation Intel® Core™ processors
- 11th generation Intel® Core™ processors
- 3rd generation Intel® Xeon® Processor Scalable Family
```
## 1.2 概览
## 1.3
### 1.3.1 位和字节序
@翻译人:hdszylcd19
在内存中的数据结构图示中,较小的内存地址显示在图的底部;从下往上增加到顶部。Bit positions 从右到左编号。该 Bit 位的值等于 2 的 positions 次方(译者注:原文的表述有点儿晦涩,不好理解。其中,position 从 0 开始,说人话就是,二进制位上 1 所表示的数值,从右往左依次为:2 的 0 次方、2 的 1 次方...)。
Intel 和 IA-32 处理器都是采用“little endian(小端)”方式存储数据;这意味着 word 的字节序是从最低有效字节开始编号(译者注:关于“大端”和“小端”问题,请查看 [大端(Big-Endian)和小端(Little-Endian)](https://juejin.cn/post/6930889701507203085/#comment))。请看图1-1。
### 1.3.2 保留位与软件兼容性
@翻译人:三分月色
在许多寄存器和内存布局描述中会有一些保留位。这些被标记为保留位的比特,是为了与未来的处理器兼容,尽管未来是未知的,软件仍将这些位视为对未来有重要影响。保留位的行为应该被认为是未定义(undefined)且不可预测的。
在处理保留位时,软件应遵循以下准则:
* 当测试含保留位的寄存器的值时,不依赖保留位的状态。应在测试之前屏蔽掉保留位。
* 存储到内存或寄存器时,不依赖于保留位的状态。
* 不依赖保留位保持信息(retain information)的能力。
* 加载寄存器时,始终使用文档中指示的值加载保留位(如果有的话),或者使用先前从同一寄存器读取的值重新加载保留位。
注意
避免任何软件依赖于 Inter 64和 IA-32 寄存器中的保留位状态。依赖寄存器的保留位,软件会依赖于处理器处理这些位的一种不确定的方式。依赖保留位的程序增加了与未来处理器不兼容的风险。
#### 1.3.2.1 指令操作符(Instruction Operands)
(译者注:这里指令名称与操作数统称为 operands)
当指令用符号表示时,会使用 IA-32 汇编语言的一个子集。在这个子集中,指令具有以下格式:
标签:助记词(参数1),参数2, 参数3
其中:
* 标签是一个唯一标识符,其后跟着一个冒号。
* 助记词是一类具有相同功能的指令操作码的保留名称(译者注:即指令名称)。
* 参数1、参数2、参数3 是可选的。根据操作码的不同,可能有 0~3 个参数。当他们出现的时候,采用数据项的字面意思或者标识符的形式。标识符要么是寄存器的保留名称,要么是假定赋值给程序中另一部分声明的数据项(可能在示例中没有显示)。
* 当算术或逻辑指令中有两个操作数时,右操作数是源,左操作数是目的。
例如:
LOADREG: MOV EAX, SUBTOTAL
在这个例子中,LOADREG 是标签,MOV 是操作码的助记标识符,EAX 是目标操作数,SUBTOTAL 是源操作数。有些汇编语言可能会将源和目标操作数放在相反的顺序。
### 1.3.3 16 进制与 2 进制数字
16 进制数字以一串 16 进制的数字(译者注:含字母)后跟字母 H 表示,(例如,0F82EH)。十六进制数字可以是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F中的一个字符。
2 进制数字由 1 和 0 组成的字符串表示,有时后面跟着字符 B(例如,1010B)。只有在数字类型可能引起混淆的情况下才使用字符 B。
### 1.3.4 段寻址(Segmented Addressing)
处理器使用字节寻址。这意味着内存是作为一个字节序列被组织和访问的。无论访问一个或多个字节,字节地址都用于定位单个字节或多个字节内存地址。可寻址的内存范围称为**地址空间**(address space)。
处理器也支持段寻址。这是一种寻址方式,程序可以有许多独立的地址空间,称为**段**(segments)。例如,一个程序可以将它的代码(指令)和堆栈保存在单独的段中。代码地址总是指向代码空间,堆栈地址总是指向堆栈空间。下面的表示法用于指定段内的字节地址:
段寄存器:字节地址
例如,下面的段地址标识 DS 寄存器所指向的段中地址 FF79H 处的字节:
DS:FF79H
下面的段地址标识代码段中的指令地址。CS 寄存器指向代码段,EIP 寄存器包含指令的地址。
CS:EIP
### 1.3.5 用于 CPUID、CR 和 MSR 值的新语法
通过使用 CPUID 指令、检查控制寄存器位和读取特定于模型的寄存器来获取特征标志、状态和系统信息。我们正在研究一种新的语法来表示这些信息。见图1 - 2。
### 1.3.6 异常
异常通常是指令出错时发生的事件。例如,尝试除以 0 会产生异常。然而,在其他条件下也会出现一些例外情况,例如断点(breakpoints)。某些类型的异常会提供错误码。错误码提供关于错误的附加信息。下面是用来显示异常和错误码的符号示例:
\#PF(错误码)
一个错误码定义了一种错误类型,上例是一个页面错误异常(page-fault exception)。在某些情况下,可能无法给到一个准确的错误码。在这种情况下,错误码为零,如下图所示为通用保护异常:
\#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 架构系列中的最新处理器上运行着。
### 2.1.1 16 位处理器与段(1978)
在 IA-32 体系结构家族之前,有 16 位处理器 8086 和 8088。8086 有 16 位寄存器和 16 位外部数据总线,20 位寻址提供 1-MByte 地址空间。8088 与 8086 相似,但它有一个 8 位的外部数据总线。
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)
# 第三章 Basic Execution Environment
## 3.4 BASIC PROGRAM EXECUTION REGISTERS
### 3.4.2 段寄存器
@翻译人:墨
段寄存器控制(代码段寄存器,数据段寄存器,堆栈段寄存器,扩展段寄存器,标志段寄存器,全局段寄存器)16 位的段选择子。段选择子是一种特殊的指针,用来标识内存中的段。为了访问内存中特定的段,该段的段选择子必须存在于适当的段寄存器中。
在编写应用代码的时候,程序员通常用汇编指令和标识符创建段选择子。汇编器和其他工具通过这些汇编指令和标识符创建实际的段选择子的值。如果编写系统代码,程序员需要直接创建段选择子。可以参考 Intel® 64 and IA-32 软件架构开发手册卷三的第三章:保护模式下的内存管理。
如何使用段寄存器取决于操作系统或执行器使用的内存管理模型。在平坦模型(未进行分段)下,段寄存器加载指向重叠段的段选择子,每个段都从线性地址空间的0地址处开始(见图 3-6 )。这些重叠
的段构成了程序的线性地址空间。通常定义两个重叠段:一个用于代码,另一个用于数据和堆栈。 CS 段寄存器指向代码段,其他所有段寄存器指向数据和堆栈段。
图3-6
使用分段内存模型时,每个段寄存器通常加载不同的段选择子,以便每个段选择子指向线性地址空间内的不同段(见图 3-7 )。因此在任何时候,程序最多可以访问线性地址空间中的六个段。要访问一个没有被任何段寄存器指向的段,程序必须先加载一个段选择子用来访问段寄存器。
图3-7
每个段寄存器都与以下三种存储类型相关联:代码,数据或堆栈。比如,CS寄存器包含代码段的段选择子,存储正在执行的指令。处理器从代码段中获取指令,使用的逻辑地址由CS寄存器中的段选择子和
EIP 寄存器的内容组成。 EIP 寄存器包含了代码段中下一条被执行的指令的偏移量。 CS 寄存器不能由应用程序显式加载。而是通过改变程序控制的指令或内部处理器操作隐式加载(比如过程调用,中断处理或任务切换)。
DS , ES , FS 和 GS 寄存器指向四个数据段。四个数据段可以安全有效的的访问不同类型的数据结构。比如创建四个独立的数据段:第一个用于当前模块的数据结构,第二个用于从高级模块导出的数据,第三个用于动态创建的结构体,第四个用于和其他程序的共享数据。为了访问额外的数据段,应用程序必须根据需要将这些段的段选择子加载到 DS , ES , FS 和 GS 寄存器中。
SS 寄存器包含了堆栈段的段选择子,当前正在执行的程序,任务或处理程序的过程堆栈都存储在这里。所有的堆栈操作都使用 SS 寄存器来查找堆栈。不像 CS 寄存器, SS 寄存器可以被显式加载,这允许应用程序建立多个堆栈并在它们之间切换。
参考 3.3 ,"内存组织",了解段寄存器如何在实模式下使用。
CS , DS , SS 和 ES 这四个段寄存器与 Intel 8086 and Intel 286 处理器中的段寄存器相同,而 FS 和 GS 寄存器通过 Intel386™ 系列处理器引入到 IA-32 结构中的。
#### 3.4.2.1 64位模式下的段寄存器
@翻译人:墨
在 64 位模式下:CS , DA , ES , SS 每个段基址被视为 0 ,而不管相关段描述符基址的值。这为代码,数据和堆栈创建了一个平坦地址空间。FS 和 GS 是例外。这两个段寄存器在计算线性地址时都可以作为附加基址寄存器(在本地数据和某些操作系统的数据结构中寻址)。
即使分段通常被禁用,段寄存器加载也可能会导致处理器执行段访问辅助。这些活动进行期间,处理器仍然可以对加载值进行大多数传统检查(即使这些检查不适用于64位模式)。需要这些检查是因为
在 64 位模式下加载的段寄存器可能会被兼容模式下运行的应用程序所使用。
在 64 位模式下禁用 CS , DA , ES , SS , FS 和 GS 的限制检查。
# 第四章 Data Types
# 第五章 Instruction Set Summary
# 第六章 Procedure Calls, Interrupts, and Exceptions
# 第七章 Programming With General-Purpose Instructions
# 第八章 ~ 第十八章
二期再译
# 第十九章 Input/Output
# 第二十章 Processor Identification and Feature Determination
# 附录 A ~ 附录 D
二期再译