這篇日志講得主要是寄存器和存儲器(這里指的是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也變成相同的值……唉,沒文化真可怕!
到此為止了,洗洗睡了……
本文出自 “New World” 博客,請務必保留此出處http://snower.blog.51cto.com/2918921/533451