轉自:http://blog.csdn.net/a3163504123/article/details/10958229
重映射之后,一般原來的地址依然有效。也就是說,可能兩個地址,對應一個存儲單元。
ARM芯片的地址重映射 映射就是一一對應的意思。重映射就是重新分配這種一一對應的關系。 我們可以把存儲器看成一個具有輸出和輸入口的黑盒子,如下圖所示,輸入量是地址,輸出的是對應地址上存儲的數據。當然這個黑盒子是由很復雜的半導體電路具現的,具體的實現的方式我們現在不管。存儲單位一般是字節。這樣,每個字節的存儲單元對應一個地址,當一個合法地址從存儲器的地址總線輸入后,該地址對應的存儲單元上存儲的數據就會出現在數據總線上面。
圖1
普通的單片機把可執行代碼和數據存放到存儲器中。單片機中的CPU從儲器中取指令代碼和數據。其中存儲器中每個物理存儲單元與其地址是一一對應而且是不可變的。如下圖,CPU讀取0x00000000地址上存儲單元的過程。
圖2
ARM比較復雜。ARM芯片與普通單片機在存儲器地址方面的不同在於:ARM芯片中有些物理存儲單元的地址可以根據設置變換。就是說一個物理存儲單元現在對應一個地址,經過設置以后,這個存儲單元就對應了另外一個地址了。圖3是隨意舉了個例子(不要與ARM芯片對應),旨在說明地址重映射的過程。圖3表示把0x00000000地址上的存儲單元映射到新的地址0x00000007上。CPU存取0x00000007就是存取0x00000000上的物理存儲單元。
圖5
圖5描述示了ARM芯片的另外一種映射方式。這個映射可以由用戶決定采用還是不采用(相關代碼在工程文件的startup.s中,這個文件是第三方提供,用戶可以修改)。這個映射主要是為了提高應用程序異常相應得速度。當我們把應用程序存放在片內FLASH的時候,異常向量表存放在0x00000000~0x0000003F存儲單元內。每次發生異常,CPU從0x00000000~0x0000003F地址上取異常向量。但是對RAM的存取速度遠高於對FLASH的存取速度,所以為了提高異常相應速度我們采取以下做法:
Step 1:
先把0x00000000~0x0000003F(FLASH)存儲單元內的異常向量表復制 到0x40000000~0x4000003F(片內RAM的最低端64個字節的存儲單元)范圍內存儲單元中。
Step 2:
把0x40000000~0x4000003F范圍內存儲單元地址重新映射到0x00000000~0x0000003F地址范圍。 這樣做了以后,當異常發生的時候,CPU取異常向量就是從RAM區中的異常向量表中區,速度快了。比如復位中斷發生,CPU從地址0x00000000取指令,但此時由於已經過地址重新映射,這個0x00000000被地址轉換器轉換成0x40000000,CPU實際上是取的RAM區中0x400000000這個存儲單元內的指令(異常向量)。 當然用戶可以不進行這種映射。片內FLASH中0x00000000~0x0000003F存儲單元具有一模一樣的異常向量表。只不過不進行這種處理,異常相應速度慢一點。但是這種速度上的差別很多情況下是不必要在意的。
圖中的地址轉換器受控制寄存器MENMAP的控制,用戶可以設置MENMAP實現對地址重映射的控制。這個地址轉換器顯然是通過內部硬件電路實現
問題
1.怎么理解芯片的地址映射?
芯片外接外部RAM和外部ROM的時候,RAM和ROM器件都是獨立器件,並沒有地址一說,或者說都只有自己的絕對地址,且從0x00開始。而對於cpu來說,0x00地址只能有1個,所以外接器件掛到cpu上時只能做地址映射,如RAM的地址為0x3000 0000, ROM地址為0x4000 0000, 這樣cpu就做了統一編址。
2.芯片寄存器是怎么影響cpu配置的,如UART_CONTROL?
在一定程度上,寄存器就可以理解為RAM,只不過速度比RAM還要快。這里寄存器還可以細分為通用寄存器,如R0/R1..., 可用於暫存數據,參與邏輯運算等等;另外還有專用寄存器,如串口的控制寄存器,每個外設都對應有自己的控制器,程序員通過對控制器的讀寫來控制外設的行為。
http://www.elecfans.com/baike/bandaoti/jichuzhishi/20100308182707.html