文 / Edward
1 冯诺依曼架构和哈佛架构
如果你学习过X86微机原理和汇编语言,你可能会依稀地记得,我们在用汇编语言开发X86代码时,需要定义数据段,代码段,堆栈段和扩展段,这些段定义好之后,将会在写程序的时候有不同的用处。比如,当我们需要用到变量的时候,我们就需要将其定义到数据段里面,而我们代码的主体开始,就是从代码段的起始处开始的,在做子函数跳转的时候,现场地址是被压入堆栈段。如图1-2-1所示。
图1-2-1 汇编语言的分段
当一个程序从硬盘被拷贝到内存上面时,它的代码编码部分被安放在代码段中,而这个程序运行时所需定义的一些变量,则会被安放在数据段中。这里需要注意的是,这里的段地址在X86机器上面都是逻辑地址,即使用段基址和偏移量组合所得到的地址。因此,如果需要操作数据段中的变量时,应当使用存储器寻址,如直接寻址,间接寻址等方式。这里,我们还需要再知道的一点是,不管我们上述中的数据段还是代码段,虽然它们的地址都是逻辑地址,逻辑地址都是存在同一块物理地址上面的,只不过加了段标识进行段限定。这种数据存储和代码存储都在同一个存储器上面的计算机架构,被称为“冯·诺依曼”架构。
“冯·诺依曼”架构的计算机在运行程序的时候,首先会把程序从硬盘拷贝到内存上面来,如果程序退出,那么这个内存将会被回收,以用于下一个程序的运行。这种情形是不是很适合我们的个人计算机运行程序?这个就是“冯·诺依曼”架构的最大好处,极大地有利于动态程序的加载。
然而“冯·诺依曼”架构由于程序存储器和数据存储器都位于同一块内存,而每次数据吞吐的时候,CPU都会去读取代码和程序,因此会影响程序的运行速度,这个缺陷也就是所谓的“冯·诺伊曼”瓶颈。
图1-2-2 冯·诺依曼结构示意图
“冯·诺依曼”结构由于数据和程序都存储在一片物理内存上,因此CPU运行程序的时候,这块内存的读写接口无疑是非常复杂的。而且程序由于存储在外部存储器上面,因此在运行的时候,还需要先拷贝到内存中去运行,在一片单片机中,这无疑是非常不实用的。我们希望的是,将程序直接在程序存储器中去运行,代码运行时产生的变量数据,再将其存储到内部存储器上。这种需求催生了另一种计算机的结构,即“哈佛结构”。
在“哈佛结构”中,一个程序的代码部分和数据部分是被独立地放置在两块不同形式的存储器上面的,存放代码的存储器叫代码存储器,一般都是ROM;存放数据的存储器叫数据存储器,一般都是SRAM,现在有一些可外扩SDRAM。由于代码和程序是被存储在两个独立的存储器上面,因此每个存储器和CPU之间的读写总线都是独立的,这也意味着,CPU从程序存储器中取指令和代码寻址时的内存访问可以完全独立开来。哈佛结构的示意图如图1-2-3所示。
图1-2-3 哈佛结构示意图
哈佛结构与冯·诺依曼结构处理器相比,处理器有两个明显的特点:使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。
传统的哈佛结构使用非常少,现在的都为改进后的哈佛结构,其结构特点为:
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存,以便实现并行处理;具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;两条总线由程序存储器和数据存储器分时共用。
2 CISC和RISC
CISC的英文全称为“Complex Instruction Set Computer”,即“复杂指令系统计算机”;
RISC的英文全称为“Reduced Instruction Set Computer”,即“精简指令集计算机”。
从字面上来看,CISC和RISC最大的区别就是指令的复杂程度。
51单片机是一种CISC,ARM-Cortex M3是一种RISC,然而如果你同时学习过51单片机汇编语言和ARM汇编语言的话,你就会发现,如果以指令数量或者指令结构的复杂程序来说,似乎ARM汇编比51汇编更加复杂。因为随着计算机需求的发展,不管是精简指令还是复杂指令,它必然要支持更多的协处理器,这就使得它们的指令数量都在增加。所以,根据指令的数量和复杂程度来区分RISC和CISC也不准确。
CISC内部为将较复杂的指令译码,也就是指令较长,分成几个周期去执行,正因如此,开发程序比较容易(指令多的缘故),但是由于指令复杂,执行工作效率较差,处理数据速度较慢。
RISC指令位数较短,内部还有快速处理指令的电路,使得指令的译码与数据的处理较快,所以执行效率比CISC高,不过,必须经过编译程序的处理,才能发挥它的效率。
CISC和早期RISC的区别如图1-2-4所示。
图1-2-4 CISC和早期RISC的异同