邏輯地址(Logical Address) 是指由程序產(chǎn)生的與段相關(guān)的偏移地址部分。例如,你在進(jìn)行C語(yǔ)言指針編程中,可以讀取指針變量本身值(&操作),實(shí)際上這個(gè)值就是邏輯地址,它是相對(duì)于你當(dāng)前進(jìn)程數(shù)據(jù)段的地址,不和絕對(duì)物理地址相干。只有在Intel實(shí)模式下,邏輯地址才和物理地址相等(因?yàn)閷?shí)模式?jīng)]有分段或分頁(yè)機(jī)制,Cpu不進(jìn)行自動(dòng)地址轉(zhuǎn)換);邏輯也就是在Intel 保護(hù)模式下程序執(zhí)行代碼段限長(zhǎng)內(nèi)的偏移地址(假定代碼段、數(shù)據(jù)段如果完全一樣)。應(yīng)用程序員僅需與邏輯地址打交道,而分段和分頁(yè)機(jī)制對(duì)您來(lái)說(shuō)是完全透明的,僅由系統(tǒng)編程人員涉及。應(yīng)用程序員雖然自己可以直接操作內(nèi)存,那也只能在操作系統(tǒng)給你分配的內(nèi)存段操作。
線性地址(Linear Address) 是邏輯地址到物理地址變換之間的中間層。程序代碼會(huì)產(chǎn)生邏輯地址,或者說(shuō)是段中的偏移地址,加上相應(yīng)段的基地址就生成了一個(gè)線性地址。如果啟用了分頁(yè)機(jī)制,那么線性地址可以再經(jīng)變換以產(chǎn)生一個(gè)物理地址。若沒(méi)有啟用分頁(yè)機(jī)制,那么線性地址直接就是物理地址。Intel 80386的線性地址空間容量為4G(2的32次方即32根地址總線尋址)。
物理地址(Physical Address) 是指出現(xiàn)在CPU外部地址總線上的尋址物理內(nèi)存的地址信號(hào),是地址變換的最終結(jié)果地址。如果啟用了分頁(yè)機(jī)制,那么線性地址會(huì)使用頁(yè)目錄和頁(yè)表中的項(xiàng)變換成物理地址。如果沒(méi)有啟用分頁(yè)機(jī)制,那么線性地址就直接成為物理地址了。
虛擬內(nèi)存(Virtual Memory) 是指計(jì)算機(jī)呈現(xiàn)出要比實(shí)際擁有的內(nèi)存大得多的內(nèi)存量。因此它允許程序員編制并運(yùn)行比實(shí)際系統(tǒng)擁有的內(nèi)存大得多的程序。這使得許多大型項(xiàng)目也能夠在具有有限內(nèi)存資源的系統(tǒng)上實(shí)現(xiàn)。一個(gè)很恰當(dāng)?shù)谋扔魇牵耗悴恍枰荛L(zhǎng)的軌道就可以讓一列火車(chē)從上海開(kāi)到北京。你只需要足夠長(zhǎng)的鐵軌(比如說(shuō)3公里)就可以完成這個(gè)任務(wù)。采取的方法是把后面的鐵軌立刻鋪到火車(chē)的前面,只要你的操作足夠快并能滿(mǎn)足要求,列車(chē)就能象在一條完整的軌道上運(yùn)行。這也就是虛擬內(nèi)存管理需要完成的任務(wù)。在Linux 0.11內(nèi)核中,給每個(gè)程序(進(jìn)程)都劃分了總?cè)萘繛?4MB的虛擬內(nèi)存空間。因此程序的邏輯地址范圍是0x0000000到0x4000000。
有時(shí)我們也把邏輯地址稱(chēng)為虛擬地址。因?yàn)榕c虛擬內(nèi)存空間的概念類(lèi)似,邏輯地址也是與實(shí)際物理內(nèi)存容量無(wú)關(guān)的。
邏輯地址與物理地址的“差距”是0xC0000000,是由于虛擬地址->線性地址->物理地址映射正好差這個(gè)值。這個(gè)值是由操作系統(tǒng)指定的。
虛擬地址到物理地址的轉(zhuǎn)化方法是與體系結(jié)構(gòu)相關(guān)的。一般來(lái)說(shuō)有分段、分頁(yè)兩種方式。以現(xiàn)在的x86 cpu為例,分段分頁(yè)都是支持的。Memory Mangement Unit負(fù)責(zé)從虛擬地址到物理地址的轉(zhuǎn)化。邏輯地址是段標(biāo)識(shí)+段內(nèi)偏移量的形式,MMU通過(guò)查詢(xún)段表,可以把邏輯地址轉(zhuǎn)化為線性地址。如果cpu沒(méi)有開(kāi)啟分頁(yè)功能,那么線性地址就是物理地址;如果cpu開(kāi)啟了分頁(yè)功能,MMU還需要查詢(xún)頁(yè)表來(lái)將線性地址轉(zhuǎn)化為物理地址:
邏輯地址 ----(段表)---> 線性地址 — (頁(yè)表)—> 物理地址
不同的邏輯地址可以映射到同一個(gè)線性地址上;不同的線性地址也可以映射到同一個(gè)物理地址上;所以是多對(duì)一的關(guān)系。另外,同一個(gè)線性地址,在發(fā)生換頁(yè)以后,也可能被重新裝載到另外一個(gè)物理地址上。所以這種多對(duì)一的映射關(guān)系也會(huì)隨時(shí)間發(fā)生變化。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/leves1989/archive/2008/11/15/3305402.aspx