Intel微处理器的发展史
先后推出的中央处理器:Intel4004、Intel8008、Intel8080/8085、8086/8088、80186、80286、i386、i486Pentium(奔腾)、Pentium II、Pentium III、Pentium IVXeon(至强)、Xeon3、Xeon5、Xeon7Itanium(安腾)、Itanium 2Core(酷睿)、i3、i5、i7、i9 系列
推出 80486 后,英特尔以 IA ( Intel Architecture )指称该架构,也称 x86-32 架构。由于从 8086 开始其后产品以 80186 、 80188 、 80286 、 i386 、 i486 等为代号命名,因而被外界称为 x86 架构, 奔腾系列、 Xeon 系列、酷睿系列全部是基于 x86 架构的产品, 它属于复杂指令集架构, Complex Instruction Set Computer, CISC。IA-64 架构是一种全新处理器架构,与 x86 不能兼容, 为了与 IA-32 兼容,设计了 x86-64 结构 (也称 Intel64 , x64 )。 扩充的内容有:物理内存、指令集、 CPU 寄存器结构、应用程序的虚拟内存。x86 从 32 位到 64 位的变化,并没有像从 16 位到 32 位的变化那样,在 系统软件层 面带来了 革命性的变化 (例如页式地址管理、多任务的引入等等), 操作系统仍然使用以前的各种机制来对硬件进行管理。
CPU架构:控制单元、运算单元和存储单元,这三部分由CPU内部总线连接,一个控制单元和一个运算单元统称一个核(Core)。多核CPU是指多个核组织(多个控制单元和多个运算单元),共用存储单元。
Intel x86微处理器结构
总线接口部件
总线:传递信息的一组公用导线。
系统总线(System Bus):从微处理器引出的若干信号线,CPU通过它们与内存和外设交换信息。
地址总线:Address Bus (单向总线)
数据总线:Data Bus
控制总线:Control Bus
寄存器 Register
存储0、1串,可以是操作数、操作数地址等
通用寄存器
寄存器组中有8个32位的寄存器(通用寄存器):EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP
EAX: 累加器 Accumulator(可看成是某存储单元的地址)
EBX: 基址寄存器 Base
ECX: 计数器 Count
EDX: 数据寄存器 Data
ESI: 源变址寄存器 Source Index
EDI: 目的变址寄存器 Destination Index
ESP: 堆栈指示器 Stack Pointer
EBP: 堆栈基址寄存器 Base Pointer
还可细分:
16位寄存器:AX、BX、CX、DX、SI、DI、BP、SP
8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL
Q: 将EAX的低16位全部置成0,指令如何写?
MOV AX, 0
Q: 将EAX的低8~15位全部置成1,指令如何写?
MOV AH, 0FFH
Q: 将EAX的低16位全部置成0,指令如何写?
MOV AX, 0
or SUB AX, AX
or XOR AX, AX
or AND AX, 0
or SHL AX, 16
or IMUL AX, 0
x86-64位 CPU 中的通用寄存器:
16 个 64 位的通用寄存器rax、rbx、rcx、rdx、rbp、rsi、rdi、rsp、r8、 r9、 r10、r11、r12、r13、r14、r15
这些寄存器的低双字、最低字、最低字节都可被独立的访问,各自有自己的名字:16 个低双字寄存器( 32 位)eax、ebx、ecx、edx、ebp、esi、edi、esp、r8d -- r15d
16 个低字寄存器 ( 16 位)ax、 bx、cx、dx、bp、si、di、sp、r8w -- r15w
16 个 最低字节寄存器 ( 16 个)al、bl、cl、dl、bpl、sil、dil、spl、r8b -- r15b
注:AH、BH、CH、DH 仍可使用,但一条指令不能同时使用旧的高字节(AH、BH、CH、DH)和一个新的最低字节寄存器(bpl、sil、dil、spl、r8b - r15b)
REX(Register Extension)
REX 前缀字节是用于增强寄存器扩展的 x86 和 x86-64 指令集体系结构中的一个特殊字节。REX 前缀字节通常出现在指令的开头,用于扩展指令的功能,主要用于以下几个方面:
64 位寻址:在 64 位模式下,REX 前缀字节用于指示使用 64 位寄存器进行操作。默认情况下,大多数指令在 64 位模式下会使用 32 位或 64 位的寄存器,但是在需要时,REX 前缀字节可以强制指定使用 64 位寄存器。
扩展寄存器编号:REX 前缀字节还可以用于扩展寄存器的编号范围。在 64 位模式下,寄存器编号被扩展以支持额外的 8 个寄存器,分别是 R8 到 R15。REX 前缀字节允许在指令中使用这些额外的寄存器。
扩展操作码:在某些情况下,REX 前缀字节还可以用于扩展操作码以支持新的指令操作。
标志寄存器
16位 CPU 中的标志寄存器是 16 位,称 FLAGS ;32位的 EFLAGS 包含 16 位 FLAGS 的全部标志位且向下兼容。
条件标志位
- Sign Flag 符号标志:运算结果的最高二进制位为1,则SF=1,否则SF=0
- Zero Flag 零标志:运算结果为0,则 ZF=1,否则 ZF=0
- Overflow Flag 溢出标志:加法:2个同符号数相加,结果的符号位发生了改变,则 OF=1。
- Carry Flag 进位标志:运算时从最高位向前产生了进位(或借位),则CF=1;否则 CF=0。
add 指令不区分有符号数加法和无符号数加法。
不论将 x, y,z 定义为 unsigned short,还是short,
执行 :
x = 32766; y = 3; z = x+y;
z 都是 8001H; 并且标志位设置是相同的。
两次显示结果不同,即将 8001H分别当成有符号数、无符号数解释,得到的结果不同。
对于 有 符号数运算,是否溢出可判断 OF 是否为 1 ;对于无符号数运算,是否溢出可判断 CF 是否为 1;
控制标志位
1.方向标志DF (Direction Flag)
串操作指令中使用,DF=0,正向(低地址向高地址)处理数据串。DF =1 (Down)
2.中断允许标志IF (Interrupt Flag)
IF=1,CPU开中断,CPU响应外设的中断请求。
3.跟踪标志 TF (Trace Flag)
TF=1,CPU处于单步工作方式,即每执行完一条指令后,CPU自动产生一个类型为1的中断,使程序单步执行。
系统标志位
1.IO特权标志 IOPL
IOPL共占2位,指定了要求执行I/O指令的特权级。如果CPU当前特权级等于或高于IOPL时,则I/O指令可以执行,否则产生一个保护异常。
2.嵌套任务标志 NT
控制中断返回指令的执行。NT=1,CPU当前执行的任务,嵌套在另一个任务之中,待执行完该任务时,应返回原来的任务中;否则,按堆栈中保存的断点返回。
3.重启动标志 RF
该标志位与系统调试寄存器一起使用,以确定是否接受调试故障。当一条指令成功执行时,CPU将RF清0。若RF置1时,下一条指令的所有调试故障被忽略,否则接受调试故障。
4.虚拟8086方式标志 VM
当VM置1时,说明CPU在虚拟8086方式下工作,否则在保护方式下工作。
指令预取部件和指令译码部件
指令指示器
保存着下一条将要被CPU执行的指令的偏移地址(简称EA) 。
EIP/IP的值由微处理器硬件自动设置,不能由指令直接访问,执行转移指令、子程序调用指令等可使其改变。
五段流水线
- 取指令(IF):根据PC的值从存储器取出指令。
- 指令译码(ID):产生指令执行所需的控制信号。
- 取操作数(OF):读取存储器操作数或寄存器操作数。
- 执行(EX):对操作数完成指定操作。
- 写回(WB):将操作结果写入存储器或寄存器。
流水线的冲突/冒险(hazard)情况
Hazards:指流水线遇到无法正确执行后续指令或执行了不该执行的指令
结构冒险 (hardware resource conflicts,硬件资源冲突):
现象:同一个部件同时被不同指令所使用
一个部件每条指令只能使用1次,且只能在特定周期使用
设置多个部件,以避免冲突。如指令存储器IM 和数据存储器DM分开
数据冒险 (data dependencies,数据相关):
现象:后面指令用到前面指令结果数据时,前面指令的结果还没产生
转发(Forwarding/Bypassing旁路) 或 前半周期读后半周期写
Load-use冒险不能通过转发解决,需阻塞(stall)一个时钟周期
编译程序优化指令顺序
控制 (分支) 冒险 (changes in program flow,改变控制流):
现象:转移或异常改变流程,后继指令在目标地址产生前已被取出
采用静态或动态分支预测
编译程序优化指令顺序(分支延迟)
分段部件和分页部件
在 x86 架构中,分段部件是指用于管理内存分段的硬件组件或机制。在早期的 x86 处理器中,内存管理是通过分段来实现的,这种方式允许程序使用不同的段来存储不同类型的数据或指令,并且每个段都可以有自己的大小和访问权限。分段部件负责管理这些段,并确保程序可以正确访问它们。
分段部件主要包括以下几个方面的功能:
段描述符(Segment Descriptor): 分段部件使用段描述符来描述每个段的属性,例如基地址、段限制、访问权限等。段描述符存储在全局描述符表(Global Descriptor Table,GDT)或局部描述符表(Local Descriptor Table,LDT)中。
段选择子(Segment Selector): 段选择子是用于标识和选择段描述符的标识符。它包含了指向段描述符的索引以及当前段的特权级别(即所处的特权级别,如内核态或用户态)。
段寄存器(Segment Registers): x86 架构中有多个段寄存器,如 CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)等。这些寄存器用于存储当前正在使用的段选择子,从而确定当前正在访问的段。
段选择(Segmentation): 分段部件根据段选择子找到对应的段描述符,并根据其属性对内存访问进行限制和保护。例如,通过段描述符中的访问权限位可以控制段的读写权限,以及是否允许执行代码等。
地址转换(Address Translation): 分段部件负责将逻辑地址(段选择子和偏移量)转换为线性地址,然后进一步转换为物理地址,以便访问内存中的实际数据。
分段部件中的段寄存器
6个16位的段寄存器:
CS:代码段寄存器 Code Segment
DS:数据段寄存器 Data Segment
SS:堆栈段寄存器 Stack Segment
ES:附加数据段寄存器
FS
GS
“.CODE”表示代码段,该段的选择子是段寄存器CS;
“.DATA”表示数据段,该段的选择子是段寄存器DS;
C程序中定义的全局变量就存储在数据段中;
“.STACK”表示堆栈段,该段的选择子是段寄存器SS;
C程序中定义的局部变量、函数参数存储在堆栈段中。
x86的3种工作方式
1.实地址方式(简称实方式)
- 可以使用32位寄存器和32位操作数
- 可以采用32位的寻址方式。
- 此时的32位CPU与16位CPU一样,只能寻址1MB物理存储空间,程序段的大小不超64KB,段基址和偏移地址都是16位的,这样的段也称为“16位段”。
2.保护方式
使用32位地址线,寻址4GB的物理存储空间,段基址和段内偏移量都是32位的。
提供了支持多任务的硬件机构,能为每个任务提供一台虚拟处理器来仿真多台处理器;
实施执行环境的隔离和保护,对不同的段设立特权级并进行访问权限检查,以防不同的程序之间的非法访问和干扰破坏,使操作系统和各应用程序都受到保护。
3.虚拟8086方式
- 在保护方式下运行的类似实方式的工作环境;
- 能充分利用保护方式提供的多任务硬件机构、强大的存储管理和保护能力;
- 多个8086程序可以通过分页存储管理机制,将各自的1MB地址空间映射到4GB物理地址的不同位置,从而共存于主存且并行运行。