1. 程式人生 > >Linux記憶體管理-虛擬地址、邏輯地址、線性地址、實體地址的區別

Linux記憶體管理-虛擬地址、邏輯地址、線性地址、實體地址的區別

概述

分頁機制在段機制之後進行,以完成線性—實體地址的轉換過程。段機制把邏輯地址轉換為線性址頁機制進一步把該線性地址再轉換為實體地址 

  幾種地址的解釋

分析linux記憶體管理機制,離不了上述幾個概念,在介紹上述幾個概念之前,先從《深入理解linux核心》這本書中摘抄幾段關於上述名詞的解釋: 首先

一、《深入理解linux核心》的解釋 邏輯地址(Logical Address) 

       包含在機器語言指令中用來指定一個運算元或一條指令的地址。這種定址方式在80x86著名的分段結構中表現得尤為具體,它促使windows程式設計師把程式分成若干段。每個邏輯地址都由一個段和偏移量組成,偏移量指明瞭從段開始的地方到實際地址之間的距離。

線性地址(linear address)(也稱虛擬地址)

       是一個32位無符號整數,可以用來表示高達4GB的地址,線性地址通常用十六進位制數字表示,值的範圍從0x00000000到0xffffffff。

實體地址(physical address)

       用於記憶體晶片級記憶體單元定址。它們與從微處理器的地址引腳按傳送到記憶體總線上的電訊號相對應。實體地址由32位或36位無符號整數表示。

二、第二種解釋

 邏輯地址(Logical Address)

是指由程式產生的與段相關的偏移地址部分。例如,你在進行C語言指標程式設計中,可以讀取指標變數本身值(&操作),實際上這個值就是邏輯地址,它是相對於你當前程序資料段的地址,不和絕對實體地址相干。只有在Intel真實模式下,邏輯地址才和實體地址相等(因為真實模式沒有分段或分頁機制,Cpu不進行自動地址轉換);邏輯也就是在Intel保護模式下程式執行程式碼段限長內的偏移地址(假定程式碼段、資料段如果完全一樣)。應用程式設計師僅需與邏輯地址打交道,而分段和分頁機制對您來說是完全透明的,僅由系統程式設計人員涉及。應用程式設計師雖然自己可以直接操作記憶體,那也只能在作業系統給你分配的記憶體段操作。(也就是說,咱們應用程式中看到的地址都是邏輯地址。)    我們在寫C程式碼的時候經常說我們定義的結構體首地址的偏移量,函式的入口偏移量,陣列首地址等等。當我們在考究這些概念的時候,其實是相對於你這個程式而言的。並不是對於整個作業系統而言的。也就是說,邏輯地址是相對於你所編譯執行的具體的程式(或者叫程序吧,事實上在執行時就是當作一個程序來執行的)而言。編譯好的程式的入口地址可以看作是首地址,而邏輯地址我們通常可以認為是在這個程式中,編譯器為我們分配好的相對於這個首地址的偏移,或者說以這個首地址為起點的一個相對的地址值。(這麼來看,邏輯地址就是一個段內偏移量,但是這麼說違背了邏輯地址的定義,在intel段管理中,一個邏輯地址,是由一個段識別符號加上一個指定段內相對地址的偏移量,表示為 [段識別符號:段內偏移量])     當我們雙擊一個可執行程式時,就是給作業系統提供了這個程式執行的入口地址。之後shell把可執行檔案的地址傳入核心。進入核心後,會fork一個新的程序出來,新的程序首先分配相應的記憶體區域。這裡會碰到一個著名的概念叫做Copy On Write,即寫時複製技術。這裡不詳細講述,總之新的程序在fork出來之後,新的程序也就獲得了整個的PCB結構,繼而會呼叫exec函式轉而去將磁碟中的程式碼載入到記憶體區域中。這時候,程序的PCB就被加入到可執行程序的佇列中,當CPU排程到這個程序的時候就真正的執行了。 我們大可以把程式執行的入口地址理解為邏輯地址的起始地址,也就是說,一個程式的開始的地址。以及以後用到的程式的相關資料或者程式碼相對於這個起始地址的位置(這是由編譯器事先安排好的),就構成了我們所說的邏輯地址。

線性地址(Linear Address)      是邏輯地址到實體地址變換之間的中間層。程式程式碼會產生邏輯地址,或者說是段中的偏移地址,加上相應段的基地址就生成了一個線性地址。如果啟用了分頁機制,那麼線性地址可以再經變換以產生一個實體地址。若沒有啟用分頁機制,那麼線性地址直接就是實體地址。Intel  對linux而言,CPU將4GB劃分為兩個部分,0-3GB為使用者空間(也可以叫核外空間),3-4GB為核心空間(也可以叫核內空間)。作業系統相關的程式碼,即核心部分的程式碼資料都會對映到核心空間,而使用者程序則會對映到使用者空間。至於系統是如何將線性地址轉換到實際的實體記憶體上,無外乎段式管理和頁式管理。

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

三、第三種解釋

虛擬記憶體(Virtual Memory)  是指計算機呈現出要比實際擁有的記憶體大得多的記憶體量。因此它允許程式設計師編制並執行比實際系統擁有的記憶體大得多的程式。這使得許多大型專案也能夠在具有有限記憶體資源的系統上實現。

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

邏輯地址與實體地址的“差距”是0xC0000000,是由於虛擬地址->線性地址->實體地址對映正好差這個值。這個值是由作業系統指定的。

邏輯地址 ----(段表)---> 線性地址 — (頁表)—> 實體地址 不同的邏輯地址可以對映到同一個線性地址上;不同的線性地址也可以對映到同一個實體地址上;所以是多對一的關係。另外,同一個線性地址,在發生換頁以後,也可能被重新裝載到另外一個實體地址上。所以這種多對一的對映關係也會隨時間發生變化。 四、第四種解釋

1,程式(程序)的虛擬地址和邏輯地址

邏輯地址(logicaladdress)指程式產生的段內偏移地址。應用程式只與邏輯地址打交道,分段分頁對應用程式來說是透明的。也就是說C語言中的&,組合語言中的符號地址,C中嵌入式彙編的”m”對應的都是邏輯地址。

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

2,實際實體記憶體地址

實體地址(physicaladdress)是CPU外部地址總線上的定址訊號,是地址變換的最終結果,一個實體地址始終對應實際記憶體中的一個儲存單元。對80386保護模式來說,如果開啟分頁機制,線性地址經過頁變換產生實體地址。如果沒有開啟分頁機制,線性地址直接對應實體地址。頁目錄表項、頁表項對應都是實體地址

實體地址用於記憶體晶片級的單元定址,與處理器和CPU連線的地址匯流排相對應。說它是“與地址匯流排相對應”,是更貼切一些。

 3,虛擬地址 

虛擬地址是對整個記憶體(不要與機器上插那條對上號)的抽像描述。它是相對於實體記憶體來講的,可以直接理解成“不真實的”,“假的”記憶體,例如,一個0x08000000記憶體地址,它並不對就實體地址上那個大陣列中0x08000000 - 1那個地址元素;之所以是這樣,是因為現代作業系統都提供了一種記憶體管理的抽像,即虛擬記憶體(virtual memory)。程序使用虛擬記憶體中的地址,由作業系統協助相關硬體,把它“轉換”成真正的實體地址。這個“轉換”,是所有問題討論的關鍵。有了這樣的抽像,一個程式,就可以使用比真實實體地址大得多的地址空間。(拆東牆,補西牆,銀行也是這樣子做的),甚至多個程序可以使用相同的地址。不奇怪,因為轉換後的實體地址並非相同的。可以把連線後的程式反編譯看一下,發現聯結器已經為程式分配了一個地址,例如,要呼叫某個函式A,程式碼不是call A,而是call 0x0811111111 ,也就是說,函式A的地址已經被定下來了。沒有這樣的“轉換”,沒有虛擬地址的概念,這樣做是根本行不通的。

五、總結

CPU將一個虛擬記憶體空間中的地址轉換為實體地址,需要進行兩步:首先將給定一個邏輯地址(其實是段內偏移量,這個一定要理解!!!),CPU要利用其段式記憶體管理單元,先將為個邏輯地址轉換成一個執行緒地址,再利用其頁式記憶體管理單元,轉換為最終實體地址。

線性地址:是CPU所能定址的空間或者範圍。 實體地址:是機器中實際的記憶體地址。換言之,是機器中的記憶體容量範圍。 邏輯地址:是對程式而言的。一般以Seg:Offset來表示。(程式設計師自己看到的地址) 因此,若要確實比較三者的話,應有以下關係:線性地址大於等於實體地址(PS:但二者的地址空間是一樣的),而邏輯地址大於線性地址。邏輯地址通過段表變換成線性地址,此時如果並未開啟分頁機制的情況下,邏輯地址直接轉換成CPU所能定址的空間。若已開啟則通過頁表完成線性地址到實體地址的變換。 因此,三者最準確的關係是:邏輯地址通過線性地址完成實體地址的對映,線性地址在三者之中完全是充當"橋"的作用。 ---------------------  作者:魚思故淵  來源:CSDN  原文:https://blog.csdn.net/yusiguyuan/article/details/9664887  版權宣告:本文為博主原創文章,轉載請附上博文連結!

-