![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Intel体系结构
一凡stkeke
程序猿要非常勤奋地把自己变成一个懒货
展开
-
【C/C++】深入理解原子操作 & volatile i为什么不能保证i++的原子性
处理器支持的原子操作首先我们来讲一下处理器支持的原子操作以及为什么i++不是原子操作。从处理器层面上来讲,处理器保证基本的访存事务的原子性,例如当处理器读取存储器中的一个字节时,在读取过程未结束之前,其他的任何设备都不可以访问这个字节。这个保证对写入字节也成立。但是处理器自动能做的保护也就仅仅如此了。i++不是原子操作对于i++这样的操作,其实是分3步执行的,读取i的值,增加i的值,...原创 2019-01-18 17:00:17 · 3448 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器通用寄存器 (2) - 64位通用寄存器
General-Purpose Registers in 64-mode 在64位模式下,有16个64位宽通用寄存器(32位模式是8个通用寄存器),默认的操作数宽度是32位(注:与32位模式相同)。但是,通用寄存器保存32位或64位的操作数。如果指定了32位操作数,则可以使用EAX/EBX/ECX/EDX/EBP/ESP/ESI/EDI和新增的R8D~R15D(注:这里D表示Doubledor...原创 2019-01-16 09:12:05 · 2905 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器段寄存器 - 32位段寄存器/64位段寄存器
Segment Registers本节主要讲述Intel处理器中的段寄存器,用于支持处理器的段式存储器管理机制。16位的8086/Intel286处理器有4个段寄存器CS/DS/SS/ES。32位的处理器运行在保护模式下时,除了先前的4个段寄存器,还引入了两个新的段寄存器FS/GS,这些寄存器都是16比特位宽。64位模式下的段寄存器有特殊性,后面有一节介绍。IA-32处理器中的段寄存器(C...原创 2019-01-16 14:03:14 · 4189 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 锁原子操作(1) - 处理器保证的原子操作
Locked Atomic Operations32位的IA-32处理器支持对系统内存中的位置执行“加锁的原子操作”。这些操作通常用于管理共享的数据结构(例如信号量,段描述符,系统段,或者页表)。两个或多个处理器可能会同时修改其中的某些域或者标志。处理器使用3种互相依赖的机制来实现加锁的原子操作:受保障的原子操作 总线封锁,使用LOCK#信号和LOCK指令前缀 缓存一致性协议,确保可以...原创 2019-01-22 12:34:38 · 1008 阅读 · 2 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 锁原子操作(2) - 总线封锁/缓存封锁
Bus LockingIntel 64和IA-32处理器提供了LOCK#信号,在某些关键的访存操作时会自动地激活assert这个信号,用于封锁系统总线或类似的链接。当这个输出信号被激活时,就会阻塞来自于其他的处理器或总线代理的总线控制请求。在其他情况下,如果软件业务逻辑需要封锁总线,可以在相应的指令前放置一个LOCK指令前缀。对于Intel386,Intel486,和Pentium处理器,...原创 2019-01-22 12:38:18 · 1064 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(1) - 概述
x86 Instruction Introduction指令用来指示处理器所要执行的操作,指令集就是某个处理器上可以执行的所有指令。通俗的说,指令可以有两种存在方式,一种是汇编程序员看到的汇编文本格式,可以保存在文本文件中, 另一种是编译后以二进制形式存在的格式,可以直接执行或者链接到其他程序中执行,我们称为机器格式指令。汇编文件可以通过汇编器转换成机器格式指令,机器格式指令可以通过反汇编程序...原创 2019-01-22 12:43:23 · 957 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(2) - 8086/16位指令格式概述
本节简单地介绍一下x86指令集的指令格式和特点,当优化文档偶尔提及指令格式时,可供参考。完整的指令集格式在Intel Software Developer’s Manual的第二卷Instruction Set Reference中有详细的讲解。通常连汇编程序员都无需特别关注这些格式,但是反汇编程序员是必须要熟悉二进制指令格式的,以后我们会开一个独立的专题专门讲述x86指令集格式。Intel ...原创 2019-01-22 12:46:10 · 1307 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(3) - 8086/16位指令前缀
指令前缀虽然没有明确的在上图中指明,8086处理器上16位实模式下,指令也可以带有下列前缀:Lock前缀,REPNE/REPNZ前缀,段跨越前缀。但是并没有操作数宽度前缀66H和地址宽度前缀67H,这两个前缀是32位保护模式下为了兼容16位数据访问引入的。段跨越前缀ES:26HCS: 2EHSS: 36HDS: 3EH封锁前缀Lock前缀: F0H重复前缀R...原创 2019-01-22 14:07:15 · 537 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(4) - 8086/16位指令操作码字节
第一字节(BYTE1)指令定义了处理器要执行的操作,例如ADD,XOR,HLT等。操作码通常位于第一字节,某些指令的操作码会扩展到第二字节(即ModR/M字节)的REG域,故有时候REG域也被称为REG/Opcode域,用来指出该域的两种用途。绝大多数的指令的第一字节的高6个比特位(即BYTE1[7:2])是操作码,BYTE1[1]是D标志位,指明操作的方向,BYTE1[0]是W标志位...原创 2019-01-22 14:12:31 · 2115 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(5) - 8086/16位指令寻址字节
第二字节(BYTE2)第二字节是ModR/M字节,基本用途是指示指令的两个操作数,以及该字节之后是否还有其他字节(位移量字节和立即数字节)。由于主要用于用于操作数寻址,所以又称为“寻址字节”。Mod域(即BYTE2[7:6],寻址模式域)有2个比特位,共4种组合,用于指示操作数的来源,即其中一个来自与存储器,或者两个都来自于寄存器。具体编码格式参见下表: Mod编码(二进制)...原创 2019-01-22 14:14:40 · 462 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(6) - 8086/16位指令位移量字节/立即数字节
第三~六字节(BYTE3~BYTE6)这4个字节是指令的可选字节,通常用来指示存储器操作数的位移量,和/或立即操作数的值。位移量字节可以是单字节或者双字节。只要有可能,程序语言翻译器(例如汇编器)总是试图生成单字节的位移量。MOD域指示后续有几个字节的位移量。遵循Intel的规范,如果是双字节位移量,则第3字节存储低位字节,第4字节存储高位字节,即低位字节存储在存储器的低地址处,高位字...原创 2019-01-22 14:17:20 · 1388 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(7) - 80386/32位指令格式概述
32-bit Instruction Format从80386的指令格式可以看出,32位指令的操作码可以是1个字节或者2个字节,还新引入了SIB(即BYTE4)字节。地址位移量和操作数宽度也都升级为32比特位长。下图来自于Pentium Pro的PRM,严格意义来讲,指令前缀并不是指令的一部分,真正的指令总是从操作码字节开始。在Pentium Pro处理器上,操作码依然是1个或2个字节...原创 2019-01-22 14:21:31 · 1391 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(8) - 80386/32位指令前缀
下面详细讲解一下指令前缀。Pentium Pro处理器支持的前缀可以分成如下四组:组1: 封锁和重复执行前缀 指令前缀 (十六进制) 描述 F0 H Lock前缀,封锁总线 The LOCK prefix can be prepended only to the following instructions...原创 2019-01-22 14:24:15 · 777 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(9) - 64位指令格式(通用格式)
64-bit Instruction Format基本上与32位指令格式相同,只是各字节宽度有所变化。原创 2019-01-23 08:28:23 · 1017 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器通用寄存器 (1) - 32位通用寄存器
General-Purpose RegistersIA-32架构提供了8个32位通用寄存器用于临时存储指令的操作数或指针;它们分别是EAX/EBX/ECX/EDX/EBP/ESP/ESI/EDI,可用于如下用途:逻辑与算术操作的操作数 地址计算的操作数 存储器指针尽管这几个寄存器都可以用于存储操作数,计算结果,和存储器指针,但是使用ESP寄存器时要格外小心。ESP寄存器保存栈指针,作...原创 2019-01-16 09:09:09 · 1815 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器基本执行环境 (2) - 64位执行环境
64-Bit Execution Environment 64位模式的执行环境与32位执行环境类似。不同点如下所述:地址空间 – 程序/任务运行在64位模式下,可以访问最高2^64字节(受制于规范寻址要求)的线性地址空间和最高2^46字节的物理地址空间。 基本的程序执行寄存器 – 通用寄存器数量增加到16个,64位宽,支持字节/单字/双字/四字整型值。字节访问同一是寄存器的最低8比特位。...原创 2019-01-15 20:43:31 · 798 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器基本执行环境 (1) - 32位执行环境概述
Basic Execution Environment OverviewIA-32处理器提供了一套完整的资源,在处理器上运行的程序/任务可以执行指令,存储代码,数据以及状态信息。这些资源(如下简要的列表和示意图)构成了IA-32处理器的基本执行环境。Intel 64处理器除了支持IA-32处理器的基本执行环境,在IA-32e模式下还支持一个类似的环境可以执行64位程序(64位子模式)与32...原创 2019-01-15 20:41:24 · 1057 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器操作模式/运行模式
Processor Operation ModeIA-32架构支持3种操作模式,和一种类操作模式(quasi-operating mode):实地址模式/实模式(real-address mode): 这种模式最早可以追溯到Intel 8086处理器上,IA-32架构支持的实模式有一些扩展(例如可以切换到保护模式或系统管理模式) 保护模式(protected mode):这是IA-32架...原创 2019-01-14 11:05:41 · 2058 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(1) - 16位FLAGS(8086/80186/80286)
IA-32 and Intel 64 (x86 & x86_64) EFLAGS Register我们首先介绍16/32位的EFLAGS标志寄存器,然后再简要的概述Intel 64架构下的64位标志寄存器。16位标志寄存器FLAGS由于Intel处理器在指令集架构层面上始终保持了向前兼容性,所以标志寄存器中的各个标志位的位置与功用在各代处理器之间都保持不变,所以对这些16位的标...原创 2019-01-14 11:09:12 · 1784 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(2) - 32位EFLAGS - 80386(386, Intel386)/80486(486, Intel486)
80386/386/Intel386标志寄存器EFLAGS80386增加了RF/VM标志位,用于支持虚拟8086模式与指令断点调试。80486/486/Intel486标志寄存器EFLAGS (1990)80486增加了AC标志位,用于数据访问时的对齐检查。80486/486/Intel486标志寄存器EFLAGS(1995)在这一版80486寄存器中,可以看到新增加了...原创 2019-01-14 11:11:47 · 631 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(3) - 32位EFLAGS - 概述
32位标志寄存器中的标志位/域可以分成3组:状态标志位,控制标志位,以及系统标志位。下图定义了这些标志位以及对应的比特位编号。在处理器刚刚初始化之后(通过激活RESET引脚或者INIT引脚),EFLAGS寄存器的值被设定为0000-0002H。比特位1,3,5,15,以及22~31都是Intel的保留位。软件不要使用或依赖这些比特位的状态,否则将失去跨处理器兼容性。 某些标志位可以使用...原创 2019-01-14 11:14:29 · 1404 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(4) - 32位EFLAGS - 状态标志与控制标志
Status Flags状态标志位(比特位0,2,4,6,7和11)指示了算术指令的结果,例如ADD,SUB,MUL,与DIV指令。 标志位 描述 CF(bit 0) 进位/借位Carry。如果算术指令的结果的最高有效位产生了进位/借位,则置1;否则置0。这个标志位指示了无符号整数计算的结果是否溢出;也用于多精度(mul...原创 2019-01-14 11:16:52 · 1274 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(5) - 32位EFLAGS - 系统标志
System Flags/Fields标志寄存器的系统标志位与IO特权级(IOPL)域可以用来控制I/O,可屏蔽硬件中断,程序调试,任务切换,以及设置虚拟8086模式(参看下图)。只有特权代码(通常是操作系统或者管理代码)被允许修改这些标志位。 标志位 描述 TF(bit 8) 陷阱Trap。当设置为1时,启用程序调...原创 2019-01-14 11:18:37 · 822 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(6) - 64位RFLAGS
64位标志寄存器RFLAGS在64位模式下,RFLAGS标志寄存器扩展到了64个比特位,但是最高32比特位全部是保留位。RFLAGS(64位模式)与EFLAGS(兼容模式)的系统标志位一致,没有增加。在IA-32e模式下,由于不支持虚拟8086模式,处理器也不允许设置VM标志位,同时也忽略对这个标志位的设置。而且,处理器也不会设置NT标志位,但是允许软件来设置NT标志位(注意,如果在IA-...原创 2019-01-15 16:41:42 · 2684 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器串行化指令(1) - 概述
Serializing Instructions注:串行化指令的概念非常容易理解,但是要用好(在哪里用,何时用)则需要深厚的处理器架构和流水线乱序执行的功底。好在大部分应用程序不会用到这类指令。Intel 64与IA-32架构定义了若干串行化指令。这些指令强制处理器完成先前指令所有的标志位,寄存器,存储器修改,清空所有的缓冲的写存操作之后,才能读取并执行后续下一条指令。例如,当MOV指令将...原创 2019-01-15 16:41:50 · 830 阅读 · 1 评论 -
Intel 64/x86_64/x86/IA-32处理器串行化指令(2) - 参考
下面总结一下本节提及的串行化指令及其用法,备考。 串行化指令 指令格式 用途及用法 INVD INVD 无效化内部缓存;启动外部缓存无效化过程 注:这条指令简单暴力,不会将修改状态的缓存行回写至内存,要小心使用。 WBINVD WB...原创 2019-01-15 16:41:57 · 563 阅读 · 0 评论 -
Intel 64/x86_64/x86/IA-32处理器的指令指针(IP/EIP/RIP)
Instruction Pointer 指令指针IP/EIP/RIP的基本功用是指向要执行的下一条地址。在8080 8位微处理器上的寄存器名称是PC(program counter,程序计数器),从8086起,被称为IP(instruction pointer,指令指针)。主要区别在与PC指向正在执行的指令,而IP指向下一条指令。指令指针EIP寄存器包含了当前代码段中的一个偏移量,通过CS...原创 2019-01-15 16:42:07 · 8167 阅读 · 0 评论 -
Intel处理器电源管理技术(1) - 概述 - 8086/286/386SL/486SL & APM & ACPI
History & OverviewIntel的8086与80286处理器并没有集成任何的电源管理技术。但是80286的确有一个全静态CMOS版本实现,主要用于电池供电的设备中,由富士通与Intersil设计。80386处理器有一个面向于笔记本电脑市场的低功耗版本变种,被称为i386SL(注:可能技术上不正确,不过可以把SL看作sleep,睡眠版本。)。从下面这张386SL的功...原创 2019-01-20 21:16:34 · 2109 阅读 · 0 评论 -
Intel处理器电源管理技术(2) - 概述 - EIST & P-State & Turbo Boost & HWP
Enhanced Intel SpeedStep Technology (EIST)Pentium M处理器引入了Enhanced Intel SpeedStep® Technology(缩写为EIST)。这项技术通过处理器的性能状态迁移(performance state transition)来进行处理器功耗管理。这些性能状态被定义为处理器的独立的操作点(operating points)...原创 2019-01-20 21:17:19 · 7998 阅读 · 0 评论 -
Intel(R) 处理器产品型号/CPUID标识/签名对照表 (Family Model)
DisplayFamily_DisplayModel Processor Families/Processor Number Series 06_85H Intel® Xeon Phi™ Processor 7215, 7285, 7295 Series based on Knights Mill microarchitecture 06_57H Intel® Xe...原创 2019-01-20 21:25:46 · 6625 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(10/E) - 特殊指令格式(AVX & AVX-512)
Special Instruction FormatAVX Instruction FormatAVX-512 Instruction Format原创 2019-01-23 08:28:39 · 567 阅读 · 0 评论