这篇日志讲得主要是寄存器和存储器(这里指的是RAM)的区别,之后才是重点,说说我对外设的片内RAM地址映射的理解。如果你学过模电并且基本是醒着上课的话那你可以潇洒得路过了,对于那些本科期间不甚逃课的人本人表示钦佩。
.寄存器与存储器的区别
现代的计算机主要包括三级存储,寄存器、内存储器和外存储器,存储数据的速率也依次递减。(外存储器不在本次讨论之中,姑且略过不讲)我们不妨将寄存器和内存储器都抽象成一个大的数组,其中的每个元素都有一个字节(8位)大小,CPU寻址的时候就是以该元素为最小单位完成的。如前一个元素的地址是
0x1FFFFFF0的话,那么下一个元素的地址就是0x1FFFFFF1。我们可以理解为硬件构成上寄存器和内存储器也都是由一个8位大小的元器件线性排列组成的,地址对应着上面讲到的数组中元素的地址。到这里也许你能明白我的意思了,抛开存储速率不谈,对面向软件开发的人来说寄存器和内存储器结构可以看作是相同的,那它们有什么不同呢?
当然是存储速率不同了!先别骂街……速率只是表面现象,寄存器与内存本质的区别还是物理结构的不同,寄存器是有DFF(D触发器)构成的;内存储器有MOS门和TTL门两种构成。它们之间的具体区别跳过不讲,我只想让你知道二者之间在寻址原理上都是相同的!
.外设内存映射机制
说到映射大家可能就会想到函数映射,脑海里会有一个画面:左边一个集合中的某个元素“射”出一条带箭头的直线指向右边的集合的某个元素。如果你高数或离散数学再好一点儿的话会想到单射、双射、满射、恒等映射(你要是这个都想到了,那你牛B!)……其实外围设备的内存映射原理是一样的,只不过左边的集体变成了CPU,右边的集合变成了外围设备,那条带箭头的线就是连接CPU和外设地址引脚的地址总线。
要知道,一个开发板的CPU地址引脚并不是所有的都与内存元器件相连的,如果该板上有外设(如一块独立显卡),那么CPU就需要分出一些引脚来与该外设的地址引脚相连,相当于将一部分内存寻址的空间分给了外设,那不相当于CPU分出去地址寻址空间为空?非也,一般的外设为了加快处理速度都有自己的片内
RAM(比如说显存,你也知道显存对显卡性能的重要性),分出去的地址空间也就与片内RAM物理连接起来,这样CPU就能像访问内存一样去访问外设的片内
RAM,这也就是所谓的内存映射(当然内存映射在程序设计中还有别的意思,但是这里的话,你懂的……)。
上面讲的都是RAM,那寄存器呢?之前啰哩啰嗦讲寄存器与内存的区别就是为了这里,我们得出的结论是二都在寻址原理上都是相同的,那寄存器看成是RAM不就行了!一样一样一样的!
其实这个知道了就很简单,但是当初我还懵懂的时候却天真的以为CPU先改变内存中的值,再通过一种什么神奇的机制让外设的RAM也变成相同的值……唉,没文化真可怕!