虛擬地址和實體地址的區別和聯絡
小編今天為大家分享了,歡迎大家前來閱讀。
CPU通過地址來訪問記憶體中的單元,地址有虛擬地址和實體地址之分,如果CPU沒有MMU***Memory Management Unit,記憶體管理單元***,或者有MMU但沒有啟用,CPU核在取指令或訪問記憶體時發出的地址將直接傳到CPU晶片的外部地址引腳上,直接被記憶體晶片***以下稱為實體記憶體,以便與虛擬記憶體區分***接收,這稱為實體地址***Physical Address,以下簡稱PA***,如下圖所示。
如果CPU啟用了MMU,CPU核發出的地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址***Virtual Address,以下簡稱VA***,而MMU將這個地址翻譯成另一個地址發到CPU晶片的外部地址引腳上,也就是將虛擬地址對映成實體地址,如下圖所示。
MMU將虛擬地址對映到實體地址是以頁***Page***為單位的,對於32位CPU通常一頁為4K。例如,虛擬地址0xb700 1000~0xb700 1fff是一個頁,可能被MMU對映到實體地址0x2000~0x2fff,實體記憶體中的一個物理頁面也稱為一個頁框***Page Frame***。
實體地址***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***
跟邏輯地址類似,它也是一個不真實的地址,如果邏輯地址是對應的硬體平臺段式管理轉換前地址的話,那麼線性地址則對應了硬體頁式記憶體的轉換前地址。
小編分享了,希望大家喜歡。
修改實體記憶體大小