文章目录
- 计算机工作模式
- 基本组成
- CPU和内存配合工作
- CPU如何将数据写回内存
- x86的原理
- 数据单元
- 控制单元
- 32位处理器
- 总结
作为Linux操作系统,如果下面的硬件千差万别,那么兼容各个硬件就会耗尽大量精力,很难做出易用的产品。
x86是一个开放的平台。
计算机工作模式
基本组成
- CPU(Central Processing Unit):中央处理器,计算机的大脑
- 总线:CPU和其他设备通过总线连接,总线其实就是主板上密密麻麻的集成电路,组成了CPU和其他设备的高速通道
- 内存:单靠CPU是无法完成计算任务的,很多复杂计算任务都需要将中间结果保存下来,基于中间结果进一步计算,中间结果由于量大,所以就需要依赖内存了。
CPU和内存配合工作
CPU包括三个部分
- 运算单元:只负责计算,例如位移、加法等,但是不知道应该算哪些数据,运算结果放在哪
- 数据单元:包含CPU内部的缓存和寄存器组,空间虽小,但速度快,暂时存放数据和运算结果。出现原因是不用运算单元经过总线去内存里拿(这种过于耗时)。
- 控制单元:指挥运算的地方,是一个统一的指挥中心,它可以获得下一条指令,然后执行这条指令,这个指令会指导运算单元去取数据单元里的某几个数据,计算出结果,然后放到数据单元里某个位置
- 每个项目都有一个项目执行计划书,是一行行项目执行的指令,都是放在档案库里面的。即每个进程都有一个程序放在磁盘上,是二进制的,里面是一行行的指令,操作一些数据。
- 进程一旦运行,比如上图中进程A和进程B会有独立的内存空间,互相隔离,程序会分别加载到进程A和进程B的内存空间里,形成各自的代码段。
CPU如何将数据写回内存
CPU如何执行这些程序,操作这些数据,产生结果并写回内存呢?
指令组成
CPU控制单元里有个指令指针寄存器,里面存放的是下一条指令在内存中的地址。控制单元会不停的将代码段的指令拿进来,先放入指令寄存器。
指令分两部分:做什么操作和操作哪些数据。要执行指令需要
- 做什么操作交给运算单元
- 操作哪些数据交给数据单元
具体执行
- 数据单元根据数据的地址,从数据段里读到数据寄存器里,参与运算
- 运算单元做完运算,产生的结果会暂存再数据单元的数据寄存器里
- 最终会有指令 将数据写回内存的数据段
- CPU里有两个寄存器,专门用来保存当前处理进程的代码段起始地址和数据段的起始地址,当进程切换的时候,这里的地址就会发生变换。
总线分类
CPU和内存传数据靠的都是总线,总线有两类
- 地址总线:地址数据,代表内存中那个位置
- 数据总线:真正存储的数据
地址总线的位数决定了寻址范围,数据总线的位数决定了一次能拿的数据大小。
x86的原理
X86因为IBM凭借大型机技术成为计算机市场的领头羊,形成垄断地位,后来被迫公开技术,形成了开放平台,遵循标准,开放,兼容的原则。
x86中最经典的一款处理器8086结构如下:
数据单元
- 为了暂存数据,8086处理器内部有8个16位的通用寄存器,也就是CPU内部的数据单元,分别是AX、BX、CX、DX、SP、BP、SI、DI。主要用于在计算过程中暂存数据。
- 这些寄存器比较灵活,其中AX、BX、CX、DX可以分成两个8位的寄存器来使用,分别是AH、AL、BH、BL、CH、CL、DH、DL,其中H就是High(高位),L就是Low(低位)
- 这样比较长的数据、短的数据都能暂存。
控制单元
- IP寄存器就是指令指针寄存器,指向代码段中下一条指令的位置。
- CPU会根据它来不断地将指令从内存的代码段中,加载到CPU的指令队列中,然后交给运算单元去执行。
- 每个进程都分代码段和数据段,为了指向不同进程的地址空间,有四个16位的段寄存器,分别是CS、DS、SS、ES。
- CS就是代码段寄存器,通过它可以找到代码在内存中的位置
- DS是数据段寄存器,通过它可以找到数据在内存中的位置
- SS是栈寄存器。栈是一个后进先出的数据结构。
- 运算中加载内存数据,需要通过DS找到内存中的数据,加载到通用寄存器中,对于一个段,有起始地址,段内具体位置,叫做偏移量。
- CS和DS都存放着一个段的起始地址,代码段的偏移量在IP寄存器中,数据段的偏移量会放在通用寄存器中。
如何凑够8086的20位地址总线?
- 将CS、DS左移4位变成20位,然后加上16位的偏移量,最终得到20位的数据地址。
- 对于20位的地址总线,最多寻址2的20次,1M空间大小,因为偏移量只能是16位的,所以一个段最大大小是64K。
32位处理器
32位处理器中,有32位地址总线,可以访问4G内存。原来的模式不行了,需要在兼容之前模式的基础上,弄出一个开放架构
- 通用寄存器从8个16位的扩展到了8个32位的,依然保留之前的16位和8位使用方式
- 执行下一条指令指针寄存器IP扩展成32位的,同样也兼容16位的
- 新的段寄存器改成了32位的,CS、SS 、DS、ES仍然是16位的,不再是段的起始地址,起始地址放在内存的某个地方,这个地方是一个表格,表格里的一项一项是段描述符,里面才是真正的地址,段寄存器里保存的是这个表格中的哪一项,成为选择子。
- 从段寄存器中拿段的起始地址,变成了间接从段寄存器找到表格中的一项,再从表格中一项中哪都段起始地址。
- 当然为了快速拿到段起始地址,段寄存器会从内存中拿到 CPU 的描述符高速缓存器中。
32位操作系统的架构下,前一种模式为实模式,后一种为保护模式
系统刚启动的时候,CPU是实模式的,和原来兼容,需要更多内存的时候,需要切换到保护模式,用到32位CPU更强大的能力。
总结