《汇编程序设计与计算机体系结构:软件工程师教程》 —2.3 处理器
799
2022-05-28
2.2 体系结构概述
宏观地来看,计算机系统是由几种主要的组件构成的,这些组件合起来就形成了我们常说的计算机。中央处理器(Central Processing Unit,CPU)当然是计算机的中枢,然而计算机要想正常运作还必须有其他一些组件,例如主板、内存以及各种输入/输出(Input/Output,I/O)设备。图2-1描述了这些常见的组件一般是怎样安排在主板上的。
图 2-1 主板上的组件
主板是连接计算机主要组件的板卡,它相当于一套高速公路系统,以供数据在组件之间移动。主板通过各种连接手段与组件相连,例如通过内存插槽与内存条相连,通过 CPU 插座(CPU Socket)与 CPU 相连,通过数据线与硬盘及光驱相连,通过扩展槽与扩展卡相连,通过连接线与键盘、鼠标及其他一些外部 I/O 设备相连等。为了与这些组件通信,数据必须沿着主板中的通信渠道来传送,这些通信渠道称为总线(bus)。
总线是指主板中的一组线路或导线,用来在组件之间传输数据。从背面观察主板很容易就能看到这些总线,如图 2-2 所示。由于导线所经过的地方各层纤维玻璃之间含铜,因此这些地方的颜色看上去比周围浅。
图 2-2 从背面观察到的主板
计算机中最主要的总线叫作系统总线(system bus),如图2-3所示,它实际上是数据总线、地址总线与控制总线这三者的合称。系统总线使得 CPU 能够与内存及计算机中的其他 I/O 设备相通信,为了确保通信正常,这些与 CPU 通信的设备必须与对应的总线连接起来。数据总线(data bus)用来在组件之间传递指令及数据,其中的指令指的是从内存中加载数据、把数据放入内存,或是从光驱中读取数据等动作。为了正确传递信息,还必须传输指令所针对的内存地址和数据。地址总线(address bus)就负责地址方面的通信工作。此外,控制总线(control bus)在系统组件的通信工作中也很重要,它会在组件之间传输信号,使得组件能够在适当的时机通信,以确保同步运作(例如,某组件不应该在某设备处于繁忙状态时从该设备中读取数据)。
除了系统总线,还需要一个部件才能使组件之间得以通信。这个部件就好比节拍器。节拍器按照一定的速度打拍子,使得表演者能够跟上音乐的节奏,而该部件也是按照一定的频率来产生脉冲,使得计算机的组件之间能够在适当的时机相互通信,而不会以任意的时间间隔随意地进行沟通。因为那样就有可能出现其中一个组件要求通信而另一个组件尚未准备好或暂时无法通信的情况。这个部件就是主板上的系统时钟(system clock)。
系统时钟的基本单位叫作时钟周期(clock cycle),它的前半段称为高电平期(up-tick),此时电压由低变高(用二进制来表示就是从 0 变成 1),后半段称为低电平期(down-tick),此时电压由高变低(或者说从 1 变成 0)。图2-4演示了整个时钟周期。
图 2-4 时钟周期
要传输数据就必须有地方来存储这些数据及指令,为此,计算机必须拥有存储器(memory)。然而在开始讨论存储器之前,首先必须知道计算机中有哪几种类型的存储器。图2-5描述了各类存储器之间的层次关系。
最顶层的存储器距离上最接近CPU 的运算电路(arithmetic circuit,该电路通常位于 CPU 自身中),而最底层的存储器则离 CPU 最远。存储器离 CPU 越远,容量越大,价格越低,而速度也越慢;反之,离 CPU 越近,容量越小,价格越高,而速度也越快。至于速度、容量与成本之间的具体关系,则要看每个位置上的存储器是什么类型。
编程知识:由于离 CPU 越远的存储器速度越慢,因此,开发汇编程序的人应该清醒地使用这些存储器。也就是说,如果程序中的数据很少且可以放入缓存(cache)中,那就不要把它放到内存(RAM)中,以免降低程序的运行速度。同理,如果程序中的数据可以放入内存中,那就不要将其写入磁盘,否则就得花时间去读写磁盘了。
离 CPU 最近的存储器是静态随机存取存储器(Static Random Access Memory),简称 SRAM。它实际上就在 CPU 芯片中。下一节会讲到,这种存储器通常称为缓存。SRAM 是速度最快的存储器类型。比它稍慢一些的是动态随机存取存储器(Dynamic RAM),简称 DRAM。主板上有一些靠近 CPU 的槽位,其中插着的内存条就属于这种类型的存储器。大家通常所说的主存(main memory)一般指的就是 DRAM,也可以简称 RAM。还有一种存储器比 DRAM 还慢,这就是机械硬盘或固态硬盘等磁盘(disk),主要相当于我们常说的硬盘,后面会讲到它。这种存储器用来长期保存数据,而不像缓存或 RAM 只用来暂时保存。向 CPU 发送数据或是从中获取数据的时候,必须与系统时钟的节奏相合,而访问这些类型的存储器中的数据时也同样要如此。
访问主存(也就是 DRAM)通常需要经过 4 个步骤,而每个步骤至少需要花费 1 个时钟周期来完成(有时还会更多),因此访问主存所需的总时间至少是 4 个时钟周期。
1. 把待读数据的内存地址放入地址总线。
2. 修改处理器的 Read(RD)标志,这是个起断言(assertion)作用的标志,也就是说,如果处理器在执行读取操作时发现该标志的值没有设置正确,就会 halt(暂停)。
3. 等待内存控制器给出响应(至少要 1 个时钟周期)。
4. 把数据从数据总线复制到目标位置。
操作内存的时候必须注意存储方式。计算机通常会依照具体的架构来把数据以字节为单位分块(chunk)保存(例如 x86 的块是 32 位,x86_64 的块是 64 位)。如果要把 32 位的十六进制值 12345678h 保存到计算机的内存中,首先需要像表2-1这样将其写为 4 个字节。由于每个十六进制位相当于 4 个二进制位,因此两个十六进制位就相当于 8 个二进制位,也就是 1 个字节。
为了保存该值,首先必须找到可以使用的内存位置。为简单起见,我们假设该值能够保存到 0x00000000h 这个位置上。一般来说都会像表 2-2 这样把数据最左侧的字节(本例中的 12)保存到地址编号最小的位置(也就是表格第一行所写的位置0x00000000)上,而把数据最右侧的字节(本例中的78)保存到地址编号最大的位置(也就是表格最后一行所写的位置,0x00000003)。
表2-2 大端序
由于内存地址也是以字节(或者说 8 个二进制位)为单位增长的,因此,像这样按照从左到右的顺序把数值中的字节保存到内存中的对应地址是符合书写习惯的。不过要注意这里的单位是字节而不是数位。表2-2这种存储方式是把权重最大的字节(或者说最高有效字节,most significant byte)保存到地址最低的地方,由于权重最大的字节(也就是“大端”,big end)出现在最前面,因此这种方式叫作大端在前的字节顺序(Big-Endian byte order),简称大端序或大尾序。还有一些计算机系统采用相反的顺序,把权重最小的字节(“小端”,little end)保存在最前面,这种保存方式称为小端在前的字节顺序(Little-Endian byte order),简称小端序或小尾序。表 2-3 演示了怎样按照小端序来保存值 12345678h。
表 2-3 小端序
编程知识:如果用常见的办法(也就是基本的变量)来访问内存中的数据,那么不用关心计算机用的是大端在前还是小端在前的字节顺序。但如果要通过内存地址来访问或查看某个位置上的数据,那就必须注意这个问题了,因为只有这样才能通过正确的地址找到你想要的数据。
Intel 的 x86 与 x86_64采用小端序,Motorola 的 68XX、68XXX 系列处理器以及 IBM 的 Z 系列采用大端序。还有的处理器两种顺序都支持,例如 Sun SPARC、ARM 及 PowerPC,这称为双端序(bi-endian)。
软件开发
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。