1. 程式人生 > >名詞解釋:arm記憶體空間、arm地址空間與arm實體記憶體

名詞解釋:arm記憶體空間、arm地址空間與arm實體記憶體

看過了一些資料,感覺這三個名詞容易混淆,以下是我自己的理解。

arm與powerpc兩種處理器跟x86不同,arm與powerpc一樣,它們的外設I/O埠是統一編址的,即與實體記憶體等外設統一編址在4GB的地址空間中(32為處理器)。而x86是將記憶體單獨編址在一個地址空間,外設I/O埠在另外的地址空間,要訪問IO地址空間需要用專門的指令操作。

因此,“arm記憶體空間”這種說法是有很大歧義的。到底是實際的實體記憶體的空間還是arm核心的所有定址空間。很多csdn blog上的“arm記憶體空間”的實際意思都是指arm的物理定址空間,即4GB。

回到linux的虛擬地址與實體地址的問題。linux的每個程序都有4GB的虛擬地址空間,其中1~3GB是每個程序獨佔的使用者空間,3GB~4GB是所有程序共享的核心空間(0xC0000000~0xFFFFFFFF)。因此虛擬地址空間包括核心空間與使用者空間。核心空間作為虛擬地址,是如何跟實際的實體地址產生關係的呢?這就是有MMU來完成這件事情了。linux的實虛地址的轉換就是有MMU通過頁表的形式完成轉換的。linux系統將arm的“實體記憶體”線性對映到核心空間中。當實體記憶體的地址空間小於核心空間時,核心空間的低地址空間將實體記憶體一一線性對映(0xC0000000~high memory),核心空間多出來的虛擬地址空間用來做I/O埠記憶體對映。當然實際應用中核心空間不可能將實體地址空間“全部霸佔”,否則使用者空間沒有實體地址可用了。這就限制了驅動程式與應用程式的量級,也因此記憶體大小是制約系統性能的重要因素。當實體記憶體的地址空間大於核心空間時,系統通過設定的巨集來使得high memory成為一個固定小於0xFFFFFFFF的數值,從而核心空間可以留出一部分虛擬地址空間用來進行IO記憶體對映使用,而實際的實體記憶體也由於high memory較小而多出空餘的記憶體來,這些記憶體就可以為系統用來做高階記憶體使用。
--------------------- 

原文:https://blog.csdn.net/helonglong88/article/details/51218301