本节书摘来自华章计算机《计算机系统:系统架构与操作系统的高度集成》一书中的第2章,作者:(美)拉姆阿堪德兰(Ramachandran, U.)(美)莱希(Leahy, W. D.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
第2章 处理器体系结构
处理器设计围绕两个体系结构的问题:指令集和机器结构。在计算机发展的早期(大约是20世纪60年代和70年代),曾有一段时间处理器设计完全被看作电子工程师的工作。计算机上大规模地使用汇编语言编程,因此,指令集越是花哨,应用程序就越趋向简单。这是当时流行的传统观念。随着现代编程语言的出现—如20世纪60年代的Algol语言—以及编译技术的快速发展,处理器设计显然不再仅仅是一项关于硬件的工作。特别地,指令集的设计与编译器如何有效地为处理器生成代码密切相关。在这个意义上,程序语言对于指令集的设计有相当大的影响。
让我们来了解程序语言是如何影响指令集设计的。高级语言中诸如赋值语句和表达式这样的结构会映射到算术/逻辑指令和加载/存储指令。高级语言支持的数据抽象需要指令集提供不同精度的操作数以及寻址模式。条件语句和循环结构需要条件和无条件跳转指令。更进一步来说,高级语言中像过程这样的模块化结构需要从处理器体系结构中获得附加的抽象支持。
应用对于指令集设计也有着重要的影响。例如,科学计算和工程计算在早期计算中占据主导地位。相应地,20世纪70年代和80年代的高端系统在指令集上支持浮点运算。当前某些时候,手机和其他嵌入式系统的计算占了主导地位,随着计算融入社会的各个层面,毫无疑问这个趋势将持续下去。音频和视频这样的流媒体应用在手持设备上变得很平常。自然地,这些应用的需求(例如,单独一条指令对许多数据进行操作)开始影响指令集的设计。
在硬件上直接支持一个具体的系统软件或应用的需求并非总是可行或划算的。例如,在计算机发展的早期,低端的计算机通过软件库使用指令集中可用的整数运算来实现浮点运算。直到今天,复杂的操作(例如求余弦)依然不应该由通用处理器的指令集直接支持。替代的方法是,一些专门的系统软件(称为数学库)通过将这些复杂操作映射为指令集中的简单指令来实现它们。
操作系统对于指令集的设计也有影响。一个处理器可能会同时运行多个程序。想想你的台式机或掌上电脑,上面运行着若干个程序,但是却没有多个处理器。因此,在我们切换到另一个程序之前,需要记住一个程序正在做什么。你可以想象一个动作麻利的厨师在4口锅里炒4个不同的菜,她记住了每道菜做到了哪个阶段并适时加入调料。操作系统是这样的一个软件实体(即是它自身的一个程序),它像厨师处理不同的菜一样,安排不同的程序在处理器上执行。操作系统自身也对处理器设计有影响,在后面讨论程序不连续性和内存管理的章节中这会变得很显而易见。