文章目录

  • 计算机工作模式
  • 基本组成
  • CPU和内存配合工作
  • CPU如何将数据写回内存
  • x86的原理
  • 数据单元
  • 控制单元
  • 32位处理器
  • 总结


作为Linux操作系统,如果下面的硬件千差万别,那么兼容各个硬件就会耗尽大量精力,很难做出易用的产品。

x86是一个开放的平台。

计算机工作模式

基本组成

服务器x86硬件架构 服务器x86硬件架构包括_寄存器

  • CPU(Central Processing Unit):中央处理器,计算机的大脑
  • 总线:CPU和其他设备通过总线连接,总线其实就是主板上密密麻麻的集成电路,组成了CPU和其他设备的高速通道
  • 内存:单靠CPU是无法完成计算任务的,很多复杂计算任务都需要将中间结果保存下来,基于中间结果进一步计算,中间结果由于量大,所以就需要依赖内存了。

CPU和内存配合工作

CPU包括三个部分

  • 运算单元:只负责计算,例如位移、加法等,但是不知道应该算哪些数据,运算结果放在哪
  • 数据单元:包含CPU内部的缓存和寄存器组,空间虽小,但速度快,暂时存放数据和运算结果。出现原因是不用运算单元经过总线去内存里拿(这种过于耗时)。
  • 控制单元:指挥运算的地方,是一个统一的指挥中心,它可以获得下一条指令,然后执行这条指令,这个指令会指导运算单元去取数据单元里的某几个数据,计算出结果,然后放到数据单元里某个位置
  • 服务器x86硬件架构 服务器x86硬件架构包括_服务器x86硬件架构_02

  • 每个项目都有一个项目执行计划书,是一行行项目执行的指令,都是放在档案库里面的。即每个进程都有一个程序放在磁盘上,是二进制的,里面是一行行的指令,操作一些数据。
  • 进程一旦运行,比如上图中进程A和进程B会有独立的内存空间,互相隔离,程序会分别加载到进程A和进程B的内存空间里,形成各自的代码段。

CPU如何将数据写回内存

CPU如何执行这些程序,操作这些数据,产生结果并写回内存呢?

指令组成

CPU控制单元里有个指令指针寄存器,里面存放的是下一条指令在内存中的地址。控制单元会不停的将代码段的指令拿进来,先放入指令寄存器。

指令分两部分:做什么操作和操作哪些数据。要执行指令需要

  • 做什么操作交给运算单元
  • 操作哪些数据交给数据单元

具体执行

  • 数据单元根据数据的地址,从数据段里读到数据寄存器里,参与运算
  • 运算单元做完运算,产生的结果会暂存再数据单元的数据寄存器里
  • 最终会有指令 将数据写回内存的数据段
  • CPU里有两个寄存器,专门用来保存当前处理进程的代码段起始地址和数据段的起始地址,当进程切换的时候,这里的地址就会发生变换。

总线分类

CPU和内存传数据靠的都是总线,总线有两类

  • 地址总线:地址数据,代表内存中那个位置
  • 数据总线:真正存储的数据

地址总线的位数决定了寻址范围,数据总线的位数决定了一次能拿的数据大小。

x86的原理

X86因为IBM凭借大型机技术成为计算机市场的领头羊,形成垄断地位,后来被迫公开技术,形成了开放平台,遵循标准,开放,兼容的原则。

x86中最经典的一款处理器8086结构如下:

服务器x86硬件架构 服务器x86硬件架构包括_代码段_03

数据单元

  • 为了暂存数据,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内存。原来的模式不行了,需要在兼容之前模式的基础上,弄出一个开放架构

服务器x86硬件架构 服务器x86硬件架构包括_数据_04

  • 通用寄存器从8个16位的扩展到了8个32位的,依然保留之前的16位和8位使用方式
  • 执行下一条指令指针寄存器IP扩展成32位的,同样也兼容16位的
  • 新的段寄存器改成了32位的,CS、SS 、DS、ES仍然是16位的,不再是段的起始地址,起始地址放在内存的某个地方,这个地方是一个表格,表格里的一项一项是段描述符,里面才是真正的地址,段寄存器里保存的是这个表格中的哪一项,成为选择子。
  • 从段寄存器中拿段的起始地址,变成了间接从段寄存器找到表格中的一项,再从表格中一项中哪都段起始地址。
  • 当然为了快速拿到段起始地址,段寄存器会从内存中拿到 CPU 的描述符高速缓存器中。

32位操作系统的架构下,前一种模式为实模式,后一种为保护模式

系统刚启动的时候,CPU是实模式的,和原来兼容,需要更多内存的时候,需要切换到保护模式,用到32位CPU更强大的能力。

总结

服务器x86硬件架构 服务器x86硬件架构包括_数据_05