这篇日志讲得主要是寄存器和存储器(这里指的是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也变成相同的值……唉,没文化真可怕!
到此为止了,洗洗睡了……