linux中的實體地址,虛擬位址,匯流排位址的區別

2021-07-22 15:28:52 字數 2285 閱讀 7718

1 邏輯位址

《understanding the linux kernel》上的解釋是與虛擬位址相關,基於硬體mmu與軟體記憶體管理的乙個概念,具體可以看utlk的第二章記憶體定址,有很詳細的解釋。

同一塊記憶體被分別線性對映到這2個位址空間中,無論處理器有無mmu單元,上電這2個位址空間就是劃分好的(2個位址空間區別在於是否預設開啟快取)。

對於mips處理器邏輯位址的劃分肯定是由其內部邏輯電路來處理,不需mmu。

2 虛擬位址

虛擬位址做為程式設計師應該聽說的最多,不管是在linux還是windows下程式設計,程式所操作位址都是虛擬位址。

虛擬位址是硬體mmu與軟體記憶體管理結合的產物,方便更高效率的使用ram。記憶體管理是篇大文章,這裡就不聊細節了,具體可以看utlk的記憶體定址一章。

邏輯位址 虛擬位址作為軟體開發人員在基於系統程式設計以及裸編下都會操作到。

3 實體地址

對於嵌入式開發,實體地址是必須明白的,實體地址是指處理器晶元發出,來進行位址空間定址的位址,它與處理器位址引腳上發出的電訊號相對應。

utlk上說用於記憶體晶元級的單元定址,真實的開發環境中不止這些,因為處理器外部除了ram還需要別的外設,如nand, spi,serial(當然是指的這些外設的controller)等。

實體地址是處理器真實傳送到其位址匯流排上的位址,而該位址應該訪問到誰(ram controller?nand controller?),這個需要看該裝置系統匯流排的仲裁,也就是匯流排仲裁,現在常用的匯流排仲裁有axi ahba等。

這些匯流排仲裁器來規劃處理器的實體地址空間。

大部分處理器手冊會給出其address map,也就是外設控制器(暫存器)在該處理器位址空間上的分布情況。

對於處理器來說,虛擬位址 邏輯位址都是乙個輸入源,處理器對這些位址進行轉換(比如利用mmu),轉換為實體地址,真正處理器發出的位址是實體地址。

4 匯流排位址

匯流排位址是最難理解的乙個概念。

所有的位址都可以稱為匯流排位址,因為開發環境下所有的裝置都是接在匯流排上,如axi匯流排,apb匯流排,pci匯流排 i2c匯流排 spi匯流排。也就會存在很多種位址空間。

大部分情況下,匯流排位址=實體地址,為什麼呢,實體地址是處理器在該系統匯流排上發出的位址,因此處理器發出的實體地址完全可以理解為處理器位址空間的匯流排位址,這肯定是相等的。

大部分程式操作都是處理器作為主裝置,根據指令,來發出位址,讀寫資料。這時匯流排位址=實體地址

有一種情況下不是處理器做主裝置,dma,dma controller操作ram是不需要經過處理器的,這是dma controller是主裝置,但是因為dma controller也是掛接在系統匯流排上,也就是處理器的位址空間中。

所以這時dma controller發出的位址也是實體地址。

有一種特殊情況下,匯流排位址與實體地址不同,就是pci匯流排。

因為pci匯流排存在位址對映,這是因為pci控制器內部有橋接電路,橋接電路會將i/o位址對映為不同的實體地址。

可以想象,pci控制器掛接在處理器的系統匯流排上,而另一端的pci匯流排上外擴了一些pci裝置。

假如某個pci裝置具有dma能力,要去操作ram,這時該裝置看到的ram的位址就應該是由系統匯流排對映到pci匯流排上的匯流排位址。

對映關係由pci控制器位址視窗來配置,一般是乙個偏移量,所以這時對映到pci匯流排上的ram的匯流排位址就不是ram在處理器系統位址空間上的實體地址(也可以稱為系統匯流排位址)了。

因此匯流排位址  !=  實體地址。

當然pci控制器位址視窗可以配置為平對映,這時匯流排位址就跟實體地址相同了。

這時還會想到一點問題,那像i2c匯流排 spi匯流排會不會也有這樣的問題,其實多慮了,pci匯流排存在這個問題,是因為pci匯流排支援裝置做主裝置,進行dma。

而i2c spi匯流排不具有這樣的能力,但是他們還是有各自的位址空間,因此我們在操作i2c spi匯流排時需要在其資料線上根據協議來傳送位址鎖定裝置的。這個位址就不是處理器位址空間了,而是相應匯流排的位址空間了。

經過上面的解釋,可以看出,任何開發環境都存在很多位址匯流排(axi pci i2c spi),也就有很多位址空間。

實體地址也是匯流排位址,只不過是處理器系統匯流排位址(如axi ahba等)罷了。

虛擬位址與實體地址

乙個程式編譯連線後形成的位址空間是乙個虛擬位址空間,但是程式最終還是要執行在物理記憶體中。因此,應用程式所給出的任何虛位址最終必須被轉化為實體地址,所以,虛擬位址空間必須被對映到物理記憶體空間中,這個對映關係需要通過硬體體系結構所規定的資料結構來建立。這就是我們所說的段描述符表和頁表,linux主要...

邏輯位址 實體地址 虛擬位址

用於記憶體晶元級的單元定址,與處理器和cpu連線的位址匯流排相對應。雖然可以直接把實體地址理解成插在機器上那根記憶體本身,把記憶體看成乙個從0位元組一直到最大空量逐字節的編號的大陣列,然後把這個陣列叫做實體地址,但是事實上,這只是乙個硬體提供給軟體的抽像,記憶體的定址方式並不是這樣。所以,說它是 與...

linux實體地址和虛擬位址定義

線性位址 linear address 是邏輯位址到物理位址變換之間的中間層 如果啟用了分頁機制,那麼線性位址可以再經過變換以產生乙個實體地址 如果沒有啟用分頁機制,那麼線性位址直接就是實體地址 分頁管理 cpu的頁式記憶體管理單元,負責把乙個線性位址,最終翻譯為乙個實體地址 例如乙個32位的機器,...