微处理器如何实现对存储器的寻址?
首先必须明确,这里说的存储器是指可以让微处理器以字节为最小单位进行读,如果是硬盘(磁盘类)或NandFlash(闪存/T卡类)这类存储器,每次读必须以page或sector(一个page或sector往往有数十个不等的字节)为单位,微处理器无法直接对这类存储器进行直接寻址,必须另有硬件将这类存储器的数据读到总线上给微处理器。
对于可以最小单位寻址的存储器,微处理器往往有专门的指令或方法来读写存储地址。而实际上,微处理器与存储地址之间的通道,是一种总线,这种微处理器用的总线根据不同微处理器架构的不同而有许多细节不同,往往不同微处理器各有自己的一套总线规范。从程序的角度,也可以认为读写存储地址的指令实际上是读写总线的指令,而总线与存储器之间的读写,自有其他硬件逻辑电路完成。
可以认为,微处理器的总线规范就决定了微处理器的寻址特性,软件无需深入理解总线规范,微处理器的数据手册自然会总结归纳出各种寻址的方式方法供软件参考。
总线的概念和意义分别是什么?
不同的场景有不同总线的意义,在这里说的总线是指在微处理器这种场景下。
在冯·诺依曼体系架构中,可以认为数据和指令共用总线,也就是运算器和译码器共用一套总线分时段来读写存储器上的数据或指令;而在哈佛体系架构中,数据和指令所用的总线是分开的两套,也就是运算器有一套总线连接到数据存储区,译码器有另一套总线连接到指令存储区。一套总线包括一条地址总线和一条数据总线,以及一条控制总线。
一条地址总线的位宽往往和译码器的位宽一致,一条数据总线的位宽往往和运算器的位宽一致,控制总线的位宽就另当别论,时钟和读写信号线等等就属于控制总线,不存在严格意义的位宽。
总线的时钟频率可能和运算器一样,也可能不一样,通常总线的时钟频率会比运算器的时钟频率低,具体低多少视不同微处理器和时钟频率高低的条件而定。
微处理器通过总线来扩展控制能力,总线上既可以挂存储器,也可以挂其他的寄存器。一般想要能被微处理器直接读写的逻辑电路,就要想办法挂到总线上,而不能直接挂到微处理器上。当然,某东西具体如何挂到总线上,当视具体某种总线规范而定。
微处理器的寻址范围是多少?
微处理器对外的控制几乎完全依靠总线,所以微处理器的寻址也就依靠地址总线。地址总线的位宽决定了微处理器的寻址范围。比如8位宽度的地址总线,寻址能力就是2的8次方即256个地址,前文已提过最小寻址单位是字节,即每个地址存一个字节,所以8位地址总线的寻址范围是256字节,依次类推,32位地址总线的寻址范围是4G字节(Byte)。从前文中可了解到,常常的,微处理器的地址总线位宽和PC指针的位宽相等,PC指针能取到数据的位宽和译码器位宽相等。
正因为通常目前32位微处理器的PC指针的位宽或说地址总线位宽和运算器的位宽相等,所以人们可以常说32位微处理器的最大寻址范围是4G字节。倘若有某种32位微处理器的PC指针位宽不是32位,可就不能这么说了。PC指针及地址总线成本很低,又对微处理器有根本寻址范围的影响,所以一般芯片设计上不会考虑节约这部分位宽,故而往往地址总线位宽和数据总线(或运算器)位宽一样,甚至还有的地址总线的位宽比数据总线的位宽要宽。
程序员眼里的总线是什么?
前面提过,微处理器的寻址,就是对总线寻址。也提过总线之中的地址总线决定了微处理器的寻址范围。所以能挂到总线上的东西,也就在地址总线上可以寻址,这个东西最终也就能在微处理器眼里有确切的地址。
随机读写存储器(RAM)肯定是挂到了总线,有许多的地址空间和存储空间,而且RAM的地址空间肯定小于总线的寻址范围,不然就是浪费宝贵的RAM。
前面还提到有的逻辑电路也想挂到总线上,这样就能被微处理器直接控制和读写。实际上逻辑电路的配置和读写接口往往是做成一个个的寄存器,这些寄存器挂在总线上,在微处理器眼里就有确切的地址可供读写。所以,微处理器可以通过读写总线上的地址,进而读写这些逻辑电路的寄存器,进而起到配置和控制各种硬件逻辑模块的作用。最后主芯片通过这些逻辑电路和主芯片的外围设备进行通讯,进而控制或读写外设。至此,计算机的输入输出等设备作为外设就可以和微处理器发生联系了。