ARM处理器的结构和指令集
冯·诺依曼结构与哈佛结构
哈弗结构起源于打卡纸存储程序指令, 而数据则存储在处理器,后来在嵌入式系统中沿用下来,将程序指令放在 ROM (Read Only Memory, 只读存储器)或 Flash 等存储器中, 可以有效地保护程序指令在执行时不被改写;而数据则保存在 RAM中, 可以读写。哈佛结构计算机将程序指令和数据分开的做法实际上是保护了程序指令。
哈佛结构示意图
冯·诺依曼结构比哈佛结构出现的稍晚一些,应该是在哈佛结构的基础上改进而来,它将程序指令和数据存储在一起的存储器结构,简化和统一了程序和数据的总线存取,也称为存储程序计算机。由于冯·诺依曼结构具有简单、通用和低成本的优势,已经成为通用计算机领域广为接受的基本概念,远比哈佛结构要广为人知。
冯·诺依曼结构示意图
在嵌入式专用计算机中,程序需要固化在硬件设备中,以硬件IC或固件FW的形式存在,产品出厂后程序几乎从不需要修改,而数据需要反复存取,因而程序和数据对存储器类型要求是不同的,程序(固件FW)所需的存储器可以是一次或有限次烧写反复读取的存储器;数据所需的是需要反复读写的存储器,这样程序存储器和数据存储器用两个独立的存储器,每个存储器独立编址、独立访问。哈佛结构将程序指令和数据分开的做法适合这种嵌入式设备的场景,而且这种分离的程序总线和数据总线可允许在一个机器周期内同时获得指令(来自程序存储器)和操作数(来自数据存储器),通常具有较高的执行效率可以保证嵌入式设备的实时性。因此哈佛结构在51单片机和ARM等嵌入式处理器中得以存在。
现代操作系统是以冯·诺依曼结构的通用计算机为基础开发,比如Linux中进程地址空间就是将程序指令和数据统一编址存储的,把进程作为一个虚拟的计算机的话,那它是冯·诺依曼结构的。那么问题来了,在ARM上运行Linux,那这台计算机是冯·诺依曼结构还是哈佛结构呢?显然冯·诺依曼结构与哈佛结构融合起来了,我们可以把所有计算机都笼统简化地理解为冯·诺依曼结构,而哈佛结构只在为了某些特殊目标而设计的硬件中,这大概是哈佛结构在智能手机中广为应用,却不如冯·诺依曼结构广为人知的原因吧。
复杂指令集和精简指令集
最初的计算机没有指令,完全由硬件电路实现专用的计算机。硬件电路中反复使用的通用电路模块就是指令产生的基础,可以说指令最初是电路模块的编号,这些编号的集合就是指令集,可认为是最初的编程语言,对应机器语言和汇编语言。复杂指令集就是在经验积累的基础上产生了大量实用指令的集合。
CISC(Complex Instruction Set Computer),即“复杂指令集计算机”,从计算机诞生以来,人们一直沿用CISC指令集方式。CISC的指令比较丰富,有专用指令来完成特定的功能。因此,处理特殊任务效率较高。随着对指令集的反复应用和抽象,逐渐发现可以去除冗余指令或合并不同指令中相同的功能,用最精简的指令集来完成相同的工作,从而简化硬件芯片的复杂度,这就产生了精简指令集。