1 邏輯地址 邏輯地址是最為模糊的概念,。 《understanding the linux kernel》上的解釋是與虛擬地址相關(guān),基于硬件MMU與軟件內(nèi)存管理的一個(gè)概念,,具體可以看UTLK的第二章內(nèi)存尋址,有很詳細(xì)的解釋,。 但是工作中之前用到的MIPS架構(gòu)的處理器的解釋卻有出入,在《MIPS體系架構(gòu)透視》一書中,,邏輯地址是跟MMU無關(guān)的,,MIPS地址空間劃分中,Kseg0 Kseg1地址空間與真實(shí)的物理地址存在一個(gè)偏移量,,也就是存在線性關(guān)系,,是一種“簡(jiǎn)單的無須轉(zhuǎn)換翻譯”的關(guān)系,。 同一塊內(nèi)存被分別線性映射到這2個(gè)地址空間中,,無論處理器有無MMU單元,上電這2個(gè)地址空間就是劃分好的(2個(gè)地址空間區(qū)別在于是否默認(rèn)開啟緩存),。 對(duì)于MIPS處理器邏輯地址的劃分肯定是由其內(nèi)部邏輯電路來處理,,不需MMU,。 2 虛擬地址 虛擬地址做為程序員應(yīng)該聽說的最多,,不管是在linux還是windows下編程,,程序所操作地址都是虛擬地址,。 虛擬地址是硬件MMU與軟件內(nèi)存管理結(jié)合的產(chǎn)物,方便更高效率的使用RAM,。內(nèi)存管理是篇大文章,,這里就不聊細(xì)節(jié)了,,具體可以看UTLK的內(nèi)存尋址一章,。 邏輯地址 虛擬地址作為軟件開發(fā)人員在基于系統(tǒng)編程以及裸編下都會(huì)操作到。 3 物理地址 對(duì)于嵌入式開發(fā),物理地址是必須明白的,,物理地址是指處理器芯片發(fā)出,,來進(jìn)行地址空間尋址的地址,,它與處理器地址引腳上發(fā)出的電信號(hào)相對(duì)應(yīng),。 UTLK上說用于內(nèi)存芯片級(jí)的單元尋址,,真實(shí)的開發(fā)環(huán)境中不止這些,,因?yàn)樘幚砥魍獠砍薘AM還需要?jiǎng)e的外設(shè),,如nand, spi,,serial(當(dāng)然是指的這些外設(shè)的controller)等。 物理地址是處理器真實(shí)發(fā)送到其地址總線上的地址,,而該地址應(yīng)該訪問到誰(ram controller,?nand controller,?),這個(gè)需要看該設(shè)備系統(tǒng)總線的仲裁,,也就是總線仲裁,現(xiàn)在常用的總線仲裁有AXI AHBA等,。 這些總線仲裁器來規(guī)劃處理器的物理地址空間,。 大部分處理器手冊(cè)會(huì)給出其address map,也就是外設(shè)控制器(寄存器)在該處理器地址空間上的分布情況,。 對(duì)于處理器來說,,虛擬地址 邏輯地址都是一個(gè)輸入源,,處理器對(duì)這些地址進(jìn)行轉(zhuǎn)換(比如利用MMU),,轉(zhuǎn)換為物理地址,,真正處理器發(fā)出的地址是物理地址,。 4 總線地址 總線地址是最難理解的一個(gè)概念。 所有的地址都可以稱為總線地址,,因?yàn)殚_發(fā)環(huán)境下所有的設(shè)備都是接在總線上,,如AXI總線,,APB總線,,PCI總線 I2C總線 SPI總線。也就會(huì)存在很多種地址空間,。 大部分情況下,,總線地址=物理地址,,為什么呢,,物理地址是處理器在該系統(tǒng)總線上發(fā)出的地址,,因此處理器發(fā)出的物理地址完全可以理解為處理器地址空間的總線地址,這肯定是相等的,。 大部分程序操作都是處理器作為主設(shè)備,,根據(jù)指令,來發(fā)出地址,,讀寫數(shù)據(jù),。這時(shí)總線地址=物理地址 有一種情況下不是處理器做主設(shè)備,,DMA,DMA controller操作RAM是不需要經(jīng)過處理器的,,這是DMA controller是主設(shè)備,但是因?yàn)镈MA controller也是掛接在系統(tǒng)總線上,,也就是處理器的地址空間中,。 所以這時(shí)DMA controller發(fā)出的地址也是物理地址,。 有一種特殊情況下,總線地址與物理地址不同,,就是PCI總線,。 因?yàn)镻CI總線存在地址映射,,這是因?yàn)镻CI控制器內(nèi)部有橋接電路,,橋接電路會(huì)將I/O地址映射為不同的物理地址。 可以想象,,PCI控制器掛接在處理器的系統(tǒng)總線上,而另一端的PCI總線上外擴(kuò)了一些PCI設(shè)備,。 假如某個(gè)PCI設(shè)備具有DMA能力,,要去操作RAM,,這時(shí)該設(shè)備看到的RAM的地址就應(yīng)該是由系統(tǒng)總線映射到PCI總線上的總線地址,。 映射關(guān)系由PCI控制器地址窗口來配置,一般是一個(gè)偏移量,,所以這時(shí)映射到PCI總線上的RAM的總線地址就不是RAM在處理器系統(tǒng)地址空間上的物理地址(也可以稱為系統(tǒng)總線地址)了,。 因此總線地址 ,!= 物理地址,。 當(dāng)然PCI控制器地址窗口可以配置為平映射,,這時(shí)總線地址就跟物理地址相同了,。 這時(shí)還會(huì)想到一點(diǎn)問題,那像I2C總線 SPI總線會(huì)不會(huì)也有這樣的問題,,其實(shí)多慮了,,PCI總線存在這個(gè)問題,,是因?yàn)镻CI總線支持設(shè)備做主設(shè)備,,進(jìn)行DMA,。 而I2C SPI總線不具有這樣的能力,,但是他們還是有各自的地址空間,,因此我們?cè)诓僮鱅2C SPI總線時(shí)需要在其數(shù)據(jù)線上根據(jù)協(xié)議來發(fā)送地址鎖定設(shè)備的,。這個(gè)地址就不是處理器地址空間了,,而是相應(yīng)總線的地址空間了,。 經(jīng)過上面的解釋,,可以看出,,任何開發(fā)環(huán)境都存在很多地址總線(AXI PCI I2C SPI),,也就有很多地址空間,。 物理地址也是總線地址,,只不過是處理器系統(tǒng)總線地址(如AXI AHBA等)罷了 |
|