天天看點

作業系統 記憶體位址(邏輯位址、線性位址、實體位址)概念

邏輯位址(logical address) 是指由程式産生的與段相關的偏移位址部分。例如,你在進行c語言指針程式設計中,可以讀取指針變量本身值(&操作),實際上這個值就是邏輯位址,它是相對于你目前程序資料段的位址,不和絕對實體位址相幹。隻有在intel實模式下,邏輯位址才和實體位址相等(因為實模式沒有分段或分頁機制,cpu不進行自動位址轉換);邏輯也就是在intel 保護模式下程式執行代碼段限長内的偏移位址(假定代碼段、資料段如果完全一樣)。應用程式員僅需與邏輯位址打交道,而分段和分頁機制對您來說是完全透明的,僅由系統程式設計人員涉及。應用程式員雖然自己可以直接操作記憶體,那也隻能在作業系統給你配置設定的記憶體段操作。

線性位址(linear address) 是邏輯位址到實體位址變換之間的中間層。程式代碼會産生邏輯位址,或者說是段中的偏移位址,加上相應段的基位址就生成了一個線性位址。如果啟用了分頁機制,那麼線性位址可以再經變換以産生一個實體位址。若沒有啟用分頁機制,那麼線性位址直接就是實體位址。intel 80386的線性位址空間容量為4g(2的32次方即32根位址總線尋址)。

實體位址(physical address) 是指出現在cpu外部位址總線上的尋址實體記憶體的位址信号,是位址變換的最終結果位址。如果啟用了分頁機制,那麼線性位址會使用頁目錄和頁表中的項變換成實體位址。如果沒有啟用分頁機制,那麼線性位址就直接成為實體位址了。

虛拟記憶體(virtual memory) 是指計算機呈現出要比實際擁有的記憶體大得多的記憶體量。是以它允許程式員編制并運作比實際系統擁有的記憶體大得多的程式。這使得許多大型項目也能夠在具有有限記憶體資源的系統上實作。一個很恰當的比喻是:你不需要很長的軌道就可以讓一列火車從上海開到北京。你隻需要足夠長的鐵軌(比如說3公裡)就可以完成這個任務。采取的方法是把後面的鐵軌立刻鋪到火車的前面,隻要你的操作足夠快并能滿足要求,列車就能象在一條完整的軌道上運作。這也就是虛拟記憶體管理需要完成的任務。在linux 0.11核心中,給每個程式(程序)都劃分了總容量為64mb的虛拟記憶體空間。是以程式的邏輯位址範圍是0x0000000到0x4000000。

有時我們也把邏輯位址稱為虛拟位址。因為與虛拟記憶體空間的概念類似,邏輯位址也是與實際實體記憶體容量無關的。

邏輯位址與實體位址的“差距”是0xc0000000,是由于虛拟位址->線性位址->實體位址映射正好差這個值。這個值是由作業系統指定的。

虛拟位址到實體位址的轉化方法是與體系結構相關的。一般來說有分段、分頁兩種方式。以現在的x86 cpu為例,分段分頁都是支援的。memory mangement unit負責從虛拟位址到實體位址的轉化。邏輯位址是段辨別+段内偏移量的形式,mmu通過查詢段表,可以把邏輯位址轉化為線性位址。如果cpu沒有開啟分頁功能,那麼線性位址就是實體位址;如果cpu開啟了分頁功能,mmu還需要查詢頁表來将線性位址轉化為實體位址:

邏輯位址 ----(段表)---> 線性位址 — (頁表)—> 實體位址

不同的邏輯位址可以映射到同一個線性位址上;不同的線性位址也可以映射到同一個實體位址上;是以是多對一的關系。另外,同一個線性位址,在發生換頁以後,也可能被重新裝載到另外一個實體位址上。是以這種多對一的映射關系也會随時間發生變化。