一个典型系统的硬件组成

总线

贯穿整个系统的是一组电子管道,称作总线(Buses)。它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字(word)。字中的字节数(即字长)是一个基本的系统参数,各个系同中都不尽相同(32,64)。

关于字:字是由若干个字节构成,字的位数叫字长,字长就是说字所对应的二进制位数的长度,比如一个64位计算机,它的1个字就由8个字节构成,字长为64位。字是其用来一次性处理事务的一个固定长度的位(bit)组。

I/O设备

即I/O bridge,是系统与外部世界的联系通道。除了显示器(display),键盘鼠标等,所有储存器也可以算是输入/输出设备,如硬盘、软盘、光盘等。

每个I/O设备都通过一个控制器(controller)或适配器(adapter)与I/O总线(I/O bus)相连。控制器和适配器之间的区别主要在于他们的封装方式。控制器是I/O设备本身或者系统主板(motherboard)上的芯片组。而适配器则是一块插在主板插槽上的卡,比如显卡就是图形适配器(graphics adapter),可以借助显卡和显示器(display)形象理解适配器。无论如何,他们的功能都是在I/O总线和I/O设备之间传递信息。

关于总线(bus):任何一个微处理器都要与一定数量的部件和外围设备连接,但如果将各部件和每一种外围设备都分别用一组线路与CPU直接连接,那么连线将会错综复杂,甚至难以实现。为了简化硬件电路设计、简化系统结构,常用一组线路,配置以适当的接口电路,与各部件和外围设备连接,这组共用的连接线路被称为总线。采用总线结构便于部件和设备的扩充,尤其制定了统一的总线标准则容易使不同设备间实现互连。

主存

主存(main memory)是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。一般来说,组成程序的每条机器指令(machine instructions)都由不同数量的字节构成。

处理器

中央处理单元(CPU)简称处理器(processer),是解释(interprets)(或执行(executes))存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器(register)),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。

从系统通电开始,直到系统断电,处理器一直在不断地执行PC指向的指令(instruction),再更新PC,使其指向下一条指令。处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集架构(instruction set architecture)决定的。在这个模型中,指令按照严格的顺序执行,而执行一条命令包含执行一系列的步骤。处理器从PC指向的内存处读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令,而这条指令并不一定和在内存中刚刚执行的指令相邻

这样的简单操作并不多,它们围绕着主存、寄存器文件、和算数/逻辑单元(ALU)进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。ALU计算新的数据和地址值。下面是一些简单操作的例子,CPU在指令的要求下可能会执行这些操作。

  • 加载:从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容。
  • 存储:从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原有的内容。
  • 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容。
  • 跳转:从指令本身(?哪里的指令)中抽取一个字,并将这个字复制到PC中,以覆盖PC中原来的值。

一些问题和杂项知识点

为什么64位计算机最大内存地址是47/48位?

因为现在还用不到完整的64位寻址空间,所以硬件也没必要支持那么多位的地址。2472^{47}约等于128G,这么大的内存显然用不了(土豪除外)。

寻址空间(Addressing space)指CPU对于内存寻址的能力。数据在存储器(RAM)中存放是有规律的 ,CPU在运算的时候需要把数据提取出来就需要知道数据存放在哪里 ,这时候就需要挨家挨户的找,这就叫做寻址,但如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。

字节对齐

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

大端序和小端序

在指针中,一个字有多个字节,字节的存储顺序有两种方式:小端序和大端序。

比如对于一个数值0x2211来说:

  • 大端字节序:0x2211,高位字节在前,低位字节在后,这是人类读写数值的方法。
  • 小端字节序:0x1122,低位字节在前,高位字节在后。

同理,对于0x1234567的大端字节序和小端字节序的写法如下图:

为什么要使用小端序?

按照习惯,使用大端序更便于阅读。

但是计算机在处理数据时,优先处理低位数据效率会更高,而计算机在处理字符的时候,只会按照顺序读取,如果按照大端序存储,读取时会先读到高位字节,后读到低位字节。使用小端序可以加快速率。

只有读取的时候,才必须区分字节序,其他情况都不用考虑。