1. 程式人生 > >實體地址空間和虛擬地址空間

實體地址空間和虛擬地址空間

http://blog.csdn.net/jiasike/article/details/38852485
一、實體地址(空間)
    因為CPU是32位的,其地址匯流排是32位的,所以其地址匯流排可編碼的個數是2^32(4G),這2^32個實體地址的集合就是實體地址空間。這與38譯碼器的道理是一樣的,這一點很好理解。

二、虛擬地址(空間)
    大多數計算機使用8位的塊,或者叫做位元組(Byte),來作為最小的可定址的儲存器單元,而不是訪問儲存器中單獨的位。
    機器級程式將儲存器視為一個非常大的位元組陣列,稱為虛擬儲存器。儲存器的一個位元組都由唯一的數字來標識,稱為它的地址(虛擬地址)。所有可能虛擬地址的集合就稱作虛擬地址空間。
                                    ——引自《深入理解計算機系統》P23

從上面這段話,我們可以得到2個資訊:
1、虛擬地址依賴於“唯一的數字標識”。
2、虛擬地址空間依賴於“所有可能虛擬地址的集合”
稍稍提煉一下,其實這就是說:虛擬地址空間就是數字可能的表示範圍。
     對於32位CPU而言,資料匯流排是32位的,所表示的資料或者說字長是32位的。所以數字的可能表示範圍就是2^32(4G)。也就是說,虛擬地址空間是4G。

小小結:
    實體地址空間的大小是由地址匯流排決定的。
    虛擬地址空間的大小是由字長決定的。

cpu看到的都是vm(虛擬地址)(在開啟mmu之後),所以程式中操作的都必須是對映後的地址空間(無論是記憶體對映後還是總線上掛載的其他模組)
記憶體對映其實就是實體地址對映到虛擬地址空間的一個子集,在對映這個層面記憶體和掛載在總線上的其他模組沒有什麼區別

對映表是對映表,記憶體是記憶體。記憶體是對映表的一部分,暫存器也是對映表的一部分。除非你用ioremap把暫存器對映到記憶體上,否則就是通過匯流排直接寫暫存器