邏輯地址

邏輯地址

邏輯地址是指在計算機體系結構中是指應用程式角度看到的記憶體單元(memory cell)、存儲單元(storage element)、網路主機(network host)的地址。 邏輯地址往往不同於物理地址(physical address),通過地址翻譯器(address translator)或映射函式可以把邏輯地址轉化為物理地址。

簡介

在有地址變換功能的計算機中,訪內指令給出的地址 (運算元) 叫邏輯地址,也叫相對地址。要經過定址方式的計算或變換才得到記憶體儲器中的實際有效地址,即物理地址。

各種計算機的定址方式 (地址變換功能)都有所不同,在用彙編語言編寫程式時,要先熟悉這個機器的指令系統。

工具書解釋

1、在有地址變換功能的計算機中,訪問指令給出的地址 (運算元) 叫邏輯地址,也叫相對地址。要經過定址方式的計算或變換才得到記憶體儲器中的物理地址。

2、把用戶程式中使用的地址稱為相對地址即邏輯地址。

3、邏輯地址由兩個16位的地址分量構成,一個為段基值,另一個為偏移量。兩個分量均為無符號數編碼。

學術文獻解釋

1、這樣該存儲單元的地址就可以用段基址(段地址)和段內偏移量(偏移地址)來表示,段基址確定它所在的段居於整個存儲空間的位置,偏移量確定它在段內的位置,這種地址表示方式稱為邏輯地址,通常表示為段地址:偏移地址的形式。

2、所謂邏輯地址是指按數據的邏輯塊號給出的磁碟的位置(l塊=512字l字=64位)而物理地址則是由磁碟的柱面、頭、段等物理位置所確定的地址。

產生背景

追根求源,Intel的8位機8080CPU,數據匯流排(DB)為8位,地址匯流排(AB)為16位。那么這個16位地址信息也是要通過8位數據匯流排來傳送,也是要在數據通道中的暫存器,以及在CPU中的暫存器和記憶體中存放的,但由於AB正好是DB的整數倍,故不會產生矛盾!

但當上升到16位機後,Intel8086/8088CPU的設計由於當年IC集成技術和外封裝及引腳技術的限制,不能超過40個引腳。但又感覺到8位機原來的地址定址能力2^16=64KB太少了,但直接增加到16的整數倍即令AB=32位又是達不到的。故而只能把AB暫時增加4條成為20條。則2^20=1MB的定址能力已經增加了16倍。但此舉卻造成了AB的20位和DB的16位之間的矛盾,20位地址信息既無法在DB上傳送,又無法在16位的CPU暫存器和記憶體單元中存放。於是應運而生就產生了CPU段結構的原理。

線性地址

一個邏輯地址由兩部份組成,段標識符和段內偏移量。段標識符是由一個16位長的欄位組成,稱為段選擇符。其中前13位是一個索引號。引號,可以理解為數組的下標——而它將會對應一個數組,它又是什麼的索引呢?這就是“段描述符(segment descriptor)”,段描述符具體地址描述了一個段(對於“段”這個字眼的理解:我們可以理解為把虛擬記憶體分為一個一個的段。比如一個存儲器有1024個位元組,可以把它分成4段,每段有256個位元組)。這樣,很多個段描述符,就組了一個數組,叫“段描述符表”,這樣,可以通過段標識符的前13位,直接在段描述符表中找到一個具體的段描述符,這個描述符就描述了一個段,我剛才對段的抽像不太準確,因為看看描述符裡面究竟有什麼東東——也就是它究竟是如何描述的,就理解段究竟有什麼東東了,每一個段描述符由8個位元組組成,如下圖:

邏輯地址 邏輯地址

這些東東很複雜,雖然可以利用一個數據結構來定義它,不過,我這裡只關心一樣,就是Base欄位,它描述了一個段的開始位置的線性地址。

Intel設計的本意是,一些全局的段描述符,就放在“全局段描述符表(GDT)”中,一些局部的,例如每個進程自己的,就放在所謂的“局部段描述符表(LDT)”中。那究竟什麼時候該用GDT,什麼時候該用LDT呢?這是由段選擇符中的T1欄位表示的,=0,表示用GDT,=1表示用LDT。

GDT在記憶體中的地址和大小存放在CPU的gdtr控制暫存器中,而LDT則在ldtr暫存器中。

好多概念,像繞口令一樣。這張圖看起來要直觀些:

邏輯地址 邏輯地址

首先,給定一個完整的邏輯地址[段選擇符:段內偏移地址],

1、看段選擇符的T1=0還是1,知道當前要轉換是GDT中的段,還是LDT中的段,再根據相應暫存器,得到其地址和大小。我們就有了一個數組了。

2、拿出段選擇符中前13位,可以在這個數組中,查找到對應的段描述符,這樣,它了Base,即基地址就知道了。

3、把Base + offset,就是要轉換的線性地址了。

相關區別

邏輯地址(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,是由於虛擬地址->線性地址->物理地址映射正好差這個值。這個值是由作業系統指定的。

相關詞條

相關搜尋

熱門詞條

聯絡我們