微码:CPU的另一番景色

栏目:线程与并发 作者:admin 日期:2018-02-24 评论:0 点击: 897 次

有些基础的同学可能知道程序的最底层就是由“机器码”构成的,这些“机器码”是由程序员们通过使用例如C、CPP等计算机语言编写的源代码经过编译器编译生成的。这些二进制的“机器码”被以某种方式让CPU读取到后执行,就形成了应用程序各种各样的行为(例如QQ能聊天、Office能办公等)。
但现实情况并非这么简单……
首先,所谓的“机器码”这个叫法本身并不专业(虽然各大技术论坛的很多文章都这么写),其正确的叫法应该是操作码(OPCode)或勉强算是正确的二进制代码,因为操作码是构成计算机指令集体系的一部分(请参考本段后面的“释义:何为指令集”),所以这并不能被理解为最原子化(不可再分割)的操作。其实,一条操作码(例如一个加1操作的操作码是十六进制的0x40,或二进制的1000000,翻译为汇编就是INC EAX)在被CPU读取执行时,并非就直接执行了,而是将这条操作码在CPU内可能会被分解为几十条至数百条不等的微指令/微码(MicroCode)再进行运算操作,最后在交由CPU物理层的逻辑电路去执行。
其次,我们平时所能接触到的一般被称之为计算机体系结构(Architecture),而CPU中使用的则是微体系结构(Microarchitecture)。这就导致实质上大多数的IT工作者(包括普通程序员乃至汇编语言程序员甚至大部分软件安全研究员)所接触的最底层其实就是计算机体系结构这一层(例如我们现在广泛使用的冯·诺依曼结构,也叫做存储程序方式结构),在这个结构中,CPU被看作是一个不可被再分割的单元,被看作是一个黑盒子,因为在大多数IT工作者的实际工作过程中,最多也只能涉及到操作码(二进制代码)这一级,所以哪怕是在例如信息安全等相对比较专业的领域,有关微体系结构中的微指令这个概念也是鲜有人知的。
最后,关于微体系结构本身,这其实是一个CPU最为核心的部分,对于大多数IT工作者而言,CPU微结构并不暴露给他们,哪怕是最底层的软件安全研究员也只能是通过操作码来访问CPU,因此就目前层面而言我们能使用CPU的最小操作粒度就是指令了。但我们上面也简单的说过,操作码在被CPU读取后还可能会被解析成为若干条更小的执行单元,并由这些单元最终驱动CPU的单个硬件逻辑电路去完成具体计算操作,而这些更小的执行单元就被称之为微操作(MicroOP/μOP)或者微指令/微码(MicroCode)。在实际应用场景中,微指令是可以完成一些非常复杂的操作的,而通过修改CPU的微指令在很多时候甚至可以帮助厂商协助用户修补已经发售CPU的Bug。

释义:何为指令集
指令集是指CPU提供给外界的功能接口,举例来说,空调的指令集就包含“开关机”、“调高温度”与“调低温度”等,而空调提供给我们的指令集接口,就是空调遥控器。
而CPU的指令集是由汇编语法、OPCode等构成,汇编语言是OPCode的一种文字化映射,可以将看似毫无含义且晦涩难读的二进制代码一一对应为用英文单词组成的汇编语言,以方便人们使用。
这类似于空调遥控器将人类完全无法看见的红外信号影射为遥控器上的一个个按钮,这样人们只需要操作按钮就可以由遥控器转化为红外信号指挥空调操作。
因此,我们可以将操作码(OPCode)类比为空调用于通信的红外信号。