Linux作業系統邏輯、線性、物理地址

來源:互聯網
上載者:User

邏輯地址(Logical Address) 是指由程式產生的和段相關的位移地址部分。例如,你在進行C語言指標編程中,能讀取指標變數本身值(&操作),實際上這個值就是邏輯地址,他是相對於你當前進程資料區段的地址,不和絕對物理地址相干。只有在Intel實模式下,邏輯地址才和物理地址相等(因為實模式沒有分段或分頁機制,Cpu不進行自動地址轉換);邏輯也就是在Intel保護模式下程式執行程式碼片段限長內的位移地址(假定程式碼片段、資料區段如果完全相同)。應用程式員僅需和邏輯地址打交道,而分段和分頁機制對你來說是完全透明的,僅由系統編程人員涉及。應用程式員雖然自己能直接操作記憶體,那也只能在作業系統給你分配的記憶體段操作。

 

線性地址(Linear Address) 是邏輯地址到物理地址變換之間的中介層。程式代碼會產生邏輯地址,或說是段中的位移地址,加上相應段的基地址就產生了一個線性地址。如果啟用了分頁機制,那麼線性地址能再經變換以產生一個物理地址。若沒有啟用分頁機制,那麼線性地址直接就是物理地址。Intel
80386的線性地址空間容量為4G(2的32次方即32根地址匯流排定址)。

 

物理地址(Physical Address) 是指出目前CPU外部地址匯流排上的定址實體記憶體的地址訊號,是地址變換的最終結果地址。如果啟用了分頁機制,那麼線性地址會使用頁目錄和頁表中的項變換成物理地址。如果沒有啟用分頁機制,那麼線性地址就直接成為物理地址了。

 

虛擬記憶體(Virtual Memory)是指電腦呈現出要比實際擁有的記憶體大得多的記憶體量。因此他允許程式員編製並運行比實際系統擁有的記憶體大得多的程式。這使得許多大型項目也能夠在具有有限記憶體資源的系統上實現。一個非常恰當的比喻是:你不必非常長的軌道就能讓一列火車從上海開到北京。你只需要足夠長的鐵軌(比如說3公裡)就能完成這個任務。採取的方法是把後面的鐵軌即時鋪到火車的前面,只要你的操作足夠快並能滿足需求,列車就能象在一條完整的軌道上運行。這也就是虛擬記憶體管理需要完成的任務。在Linux0.11核心中,給每個程式(進程)都劃分了總容量為64MB的虛擬記憶體空間。因此程式的邏輯位址範圍是0x0000000到0x4000000。有時我們也把邏輯地址稱為
虛擬位址。因為和虛擬記憶體空間的概念類似,邏輯地址也是和實際實體記憶體容量無關的。邏輯地址和物理地址的“差距”是0xC0000000,是由於虛擬位址->線性地址->物理地址映射正好差這個值。這個值是由作業系統指定的。機理 邏輯地址(或稱為虛擬位址)到線性地址是由CPU的段機制自動轉換的。如果沒有開啟分頁管理,則線性地址就是物理地址。如果開啟了分頁管理,那麼系統程式需要參和線性地址到物理地址的轉換過程。具體是通過設定頁目錄表和頁表項進行的。

 

物理地址(physical address)

      用於記憶體晶片級的單元定址,與處理器和CPU串連的地址匯流排相對應。 ——這個概念應該是這幾個概念中最好理解的一個,但是值得一提的是,雖然可以直接把物理地址理解成插在機器上那根記憶體本身,把記憶體看成一個從0位元組一直到最大空量逐位元組的編號的大數組,然後把這個數組叫做物理地址,但是事實上,這隻是一個硬體提供給軟體的抽像,記憶體的定址方式並不是這樣。所以,說它是“與地址匯流排相對應”,是更貼切一些,不過拋開對實體記憶體定址方式的考慮,直接把物理地址與物理的記憶體一一對應,也是可以接受的。也許錯誤的理解更利於形而上的抽像。
虛擬記憶體(virtual memory) 這是對整個記憶體(不要與機器上插那條對上號)的抽像描述。它是相對於實體記憶體來講的,可以直接理解成“不直實的”,“假的”記憶體,例如,一個0x08000000記憶體位址,它並不對就物理地址上那個大數組中0x08000000 - 1那個地址元素;之所以是這樣,是因為現代作業系統都提供了一種記憶體管理的抽像,即虛擬記憶體(virtual memory)。進程使用虛擬記憶體中的地址,由作業系統協助相關硬體,把它“轉換”成真正的物理地址。這個“轉換”,是所有問題討論的關鍵。有了這樣的抽像,一個程式,就可以使用比真實物理地址大得多的地址空間。(拆東牆,補西牆,銀行也是這樣子做的),甚至多個進程可以使用相同的地址。不奇怪,因為轉換後的物理地址並非相同的。
——可以把串連後的程式反編譯看一下,發現連接器已經為程式分配了一個地址,例如,要調用某個函數A,代碼不是call A,而是call 0x0811111111 ,也就是說,函數A的地址已經被定下來了。沒有這樣的“轉換”,沒有虛擬位址的概念,這樣做是根本行不通的。打住了,這個問題再說下去,就收不住了。

 

邏輯地址(logical address)

     Intel為了相容,將遠古時代的段式記憶體管理方式保留了下來。邏輯地址指的是機器語言指令中,用來指定一個運算元或者是一條指令的地址。以上例,我們說的連接器為A分配的0x08111111這個地址就是邏輯地址。 ——不過不好意思,這樣說,好像又違背了Intel中段式管理中,對邏輯地址要求,“一個邏輯地址,是由一個段標識符加上一個指定段內相對位址的位移量,表示為
[段標識符:段內位移量],也就是說,上例中那個0x08111111,應該表示為[A的程式碼片段標識符: 0x08111111],這樣,才完整一些” 線性地址(linear address)或也叫虛擬位址(virtual address) 跟邏輯地址類似,它也是一個不真實的地址,如果邏輯地址是對應的硬體平台段式管理轉換前地址的話,那麼線性地址則對應了硬體頁式記憶體的轉換前地址。

CPU將一個虛擬記憶體空間中的地址(邏輯地址)轉換為物理地址,需要進行兩步:首先將給定一個邏輯地址,CPU要利用其段式記憶體管理單元,先將為個邏輯地址轉換成一個線程地址,再利用其頁式記憶體管理單元,轉換為最終物理地址。
這樣做兩次轉換,的確是非常麻煩而且沒有必要的,因為直接可以把線性地址抽像給進程。之所以這樣冗餘,Intel完全是為了相容而已。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.