cpu的实模式
由于mbr在实模式下工作……什么?什么是实模式?这时候有同学打断了我。我心想,这下好办了……哈哈,没有啦,开个玩笑而已。我们这里所说的实模式其实就是8086 cpu的工作环境、工作方式、工作状态,这是一整套的内容,并不是单指某一方面的设置。
实模式是指8086 cpu的寻址方式,寄存器大小,指令用法等,是用来反应cpu在该环境下如何工作的概念。所以想了解实模式这种抽象的概念,主要就是了解在实模式下cpu能做什么。
大家都学过汇编语言吧,里面有讲实模式、保护模式之类的,但鉴于太过久远,为了让后面的工作顺利进行,我觉得还是有必要给大家介绍下cpu的工作模式。
cpu的工作原理
在介绍cpu的各种模式之前 ,先占用大家几分钟的时间 ,说点在两种模式下公共的内容,和大家聊聊cpu的工作原理。当然这里所说工作原理可不像微机接口技术里那么细致,精确到逻辑门等电子电路。第一我也不会,想讲也讲不出来,吼吼^0^。第二我觉得没必要懂到那么细致,如果懂的太细了,会为之所累,您想,每次执行一条指令时,您的大脑总是联想到各种元件的工作流程,本来一瞬间完成的工作您可能要给放大一千倍,非得强迫症似的要求掌握每个步骤的细节,万一在哪个点上想不通了这就会让人感到很沮丧,影响心情,甚至质疑上层的编译器,哈哈,我知道说的有点严重了,不夸张一点的话不容易表述问题,好了,下面在宏观上介绍下cpu工作原理。
大家都知道,cpu的唯一的任务就是执行指令,在它眼里,指令就是一串010101…,那它执行每条指令的流程是怎样的呢。cpu大体上可以划分为3个部分,它们是控制单元、运算单元、存储单元。控制单元是cpu的控制中心,cpu需要经过它的帮忙才知道自己下一步要做什么。而控制单元大致是由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)、操作控制器OC(Operation Controller)组成。程序被加载到内存后,也就是指令这时都在内存中了,指令指针寄存器IP指向内存中下一条待执行指令的地址,控制单元根据IP寄存器的指向,将位于内存中的指令逐个装载到指令寄存器中,但它还是不知道这些指令是什么,在它眼里的0101串此时还没有实际意义。然后指令译码器将位于指令寄存器中的指令按照指令格式来解码,分析出操作码是什么,操作数在哪里之类的。下面给出了一般的指令格式:
前缀 操作码 寻址方式、操作数类型 立即数 偏移量
看上去还是蛮复杂的,复杂的原因是必须用一种统一的格式去归纳所有形式的指令,因为cpu只能识别一种格式,万物的源头必须是最简单的,cpu也一样。这就好比要求用一句话表达出宇宙苍生,似乎看上去不可能?能,一定能,只要这句话足够长就行^_^。就像等待女朋友化妆一样,她怕你等烦了,于是就安慰你一句:“还有一首歌的时间就好了”,其实你明白,这首歌是《黄河大合唱》,一共8个乐章且唱呢……^5^。
由于cpu支持的指令数量较多,一些指令还可以搭配一些辅助的东东,所以就需要在前缀部分记录这些,如rep(用于重复执行,汇编中经常用)、段超越前缀。操作码就是大家平时用的mov、jmp等等。寻址方式又有好多,如基址寻址、变址寻址等等,操作数类型中记录的是用哪些寄存器之类的。如果在指令中用到了立即数,就要将其记录到指令格式中立即数部分,如果寻址方式中有到了偏移量,就要将此偏移量记录到指令格式中的偏移量部分。
既然指令是存放在指令寄存器中,那指令中用到的数据存放到哪里呢,下面介绍存储单元。
存储单元是指cpu内部的L1、L2缓存及寄存器,待处理的数据就存放在这些存储单元中,这里的数据是说指令中的操作数。为什么数据已经在内存中了还非得在cpu内部再整这么个存储单元干吗?原因是缓存基本上都是采用SRAM (Static RAM)存储器,从名字上看就知道它是一种具有静态存取功能的存储器。这么一说,似乎还有动态存储功能的存储器?是啊,其实我们插在主板上的物理内存就是DRAM(Dynamic Random Access Memory), DRAM内存需要每隔一段时间就去刷新电路,刷新就是指给DRAM充电,否则存储的数据就会丢失。而SRAM不需要刷新电路即能保存它内部存储的数据,这就是静态的含义,因此SRAM性能较强劲。但SRAM也不是完美无缺的,它的集成度较低,相同容量之下,SRAM的体积比DRAM要大很多。所以二级缓存都不大,目前来说顶多4兆左右,所以现代cpu用二级缓存的数量取胜,如L1、L2、L3共三级。寄存器可分为两大类,程序员可以使用的寄存器称为程序可见寄存器,如通用寄存器,段寄存器。程序不可见寄存器是指程序员不可使用,也无法访问到它们,系统运行期间可能要用到的寄存器,如ALU算术逻辑单元在求和时,会将结果先送到数据暂存寄存器。操作码有了,操作数有了,就差执行指令了,随后“操作控制器”给相关部件发信号,会给哪些部件发信号呢?如下面要介绍的运算单元。
运算单元是负责算术运算(加减乘除)和逻辑运算(比较、移位),它从控制单元那里接收命令(信号)并执行,它没有自主意识,只是个执行部件。它们之间的关系如图:
好啦,文字描述过了,图也看过了,总结下cpu的工作原理:控制单元要取下一条待运行的指令,该指令的地址是在程序计数器PC中,在x86cpu上,程序计数器就是cs:ip。于是读取ip寄存器后,将此地址送上地址总线,cpu根据此地址便得到了指令,并将其存入到指令寄存器IR中。这时候轮到指令译码器上场了,它根据指令格式检查指令寄存器中的指令,先确定操作码是什么,再检查操作数类型,若是在内存中,就将相应操作数从内存中取回放入自己的存储单元,若操作数是在寄存器中就直接用了,免了取操作数这一过程。操作码有了,操作数也齐了,操作控制器给运算单元下令,开工,于是运算单元便真正开始执行指令了。ip寄存器的值被加上当前指令的大小,于是ip又指向了下一条指令的地址。接着控制单元又要取下一条指令了,流程回到了本段开头,cpu便开始了日复一日的循环,由于cpu特别不容易坏,所以唯一它停下来的条件就是停电。
以上是cpu的工作原理,无论cpu在哪种模式下工作,这一核心原理是不变的。有了这一思想武装起来后再讲模式就简单多了,兄弟们加油,下一节,不见不散。