邏輯位址到實體地址的轉換過程

2021-05-23 09:41:38 字數 1357 閱讀 7191

cpu將乙個虛擬記憶體空間中的位址轉換為實體地址,需要進行兩步:首先將給定乙個邏輯位址(其實是段內偏移量,這個一定要理解!!!),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)

跟邏輯位址類似,它也是乙個不真實的位址,如果邏輯位址是對應的硬體平台段式管理轉換前位址的話,那麼線性位址則對應了硬體頁式記憶體的轉換前位址。

邏輯位址與實體地址的轉換

最近一直在學8086,上課老師突然問了個這。對於問題 8086 cpu 能提供20位的位址資訊,可直接對1m個儲存單元進行訪問,而cpu內部可用來提供位址資訊的暫存器都是16位,那怎樣用16位暫存器來實現20位位址定址呢 明白了不少。下圖是8086的cpu架構。那個年代,條件比較差,能湊合的就湊合,...

邏輯位址與實體地址

邏輯位址 logical address 是指由程式產生的與段相關的偏移位址部分。例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址,它是相對於你當前程序資料段的位址,不和絕對實體地址相干。只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段...

邏輯位址與實體地址

邏輯位址 logical address 例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址,它是相對於你當前程序資料段的位址,與絕對實體地址無關。只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段或分頁機制,cpu不進行自動位址轉換 邏輯...