linux上得內存映射

邏輯地址(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。

與物理地址空間相似,線性地址空間也是平坦的4GB地址空間,地址範圍從0到0xFFFFFFFF,線性空間中含有爲系統定義的全部段和系統表。

有時咱們也把邏輯地址稱爲虛擬地址。由於與虛擬內存空間的概念相似,邏輯地址也是與實際物理內存容量無關的。
程序員

邏輯地址與物理地址的「差距」是0xC0000000,是因爲虛擬地址->線性地址->物理地址映射正好差這個值。這個值是由操做系統指定的。編程

 

虛擬地址到物理地址的轉化方法是與體系結構相關的。通常來講有分段、分頁兩種方式。以如今的x86 cpu爲例,分段分頁都是支持的。Memory Mangement Unit負責從虛擬地址到物理地址的轉化。邏輯地址是段標識+段內偏移量的形式,MMU經過查詢段表,能夠把邏輯地址轉化爲線性地址。若是cpu沒有開啓 分頁功能,那麼線性地址就是物理地址;若是cpu開啓了分頁功能,MMU還須要查詢頁表來將線性地址轉化爲物理地址:
邏輯地址 ----(段表)---> 線性地址 — (頁表)—> 物理地址
不一樣的邏輯地址能夠映射到同一個線性地址上;不一樣的線性地址也能夠映射到同一個物理地址上;因此是多對一的關係。另外,同一個線性地址,在發生換頁之後,也可能被從新裝載到另一個物理地址上。因此這種多對一的映射關係也會隨時間發生變化。spa

相關文章
相關標籤/搜索