相同線性位址到不同實體地址的轉換(個人心得)

2021-04-13 08:51:12 字數 3002 閱讀 1931

目的:程式產生的

虛擬位址32位

(高10

位,中10

位,低12

位)轉換成不同的實體地址呢?(共享頁面的除外)

手段:通過

pgd頁目錄表、

pte頁面表,表轉換(這些表由作業系統維護)即轉換函式

通過這兩張表的內容和線性位址,可以完成

4g的虛擬空間的轉換,正因為程式不可能用到

4g空間,

沒有用到的位址空間,就不需要為其位址對映建立

pte表

,分配物理頁面

了,所以兩級目錄會為我們節省儲存空間,假設程式用到了整個的

4g空間,那兩級目錄是沒有意義的,另外還有一點通過兩級目錄,可以對映到不連續的物理頁面上,這也是兩級目錄的乙個好處。

步驟:1。每個程序有個

mm_struct

結構,此結構儲存了乙個

pgd指標,通過這個轉換成

cr3的值,重置

cr3,(演算法為此值減去

0x 0c 0000000,

因為程式產生的是虛擬位址,

cr3要的是實體地址) 步驟

2。cr3為基址,以

線性位址高10位

做為索引,找到

pgd的某一項。 步驟

3。每個程序只有乙個

pgd表,這個表共有

1024

項,每項

32位,共

4k,剛好占用乙個物理頁面。

cpu取其前20

位,在這

20位後面自動加上

12個零,以此為基址,

以線性位址中

10位為索引,得到

pte的值。

問題:為什麼只取前

20位,後

12位做什麼的?

答:利用

pgd是用來當

pte表的基址的,注意

pte表,(乙個

pte表共有

1024

項,每項32位

4位元組,共

4k,剛好占用乙個物理頁面)所以對於

pte表來說,其基址都是

4k位元組對齊的,本來低

12位是用來定位這乙個

pte表

4k中的某乙個位置,現

pte表

都是4k

位元組對齊的,那低

12可以另做他用。

linux

將其用來做標誌位,其中最重要的乙個標誌位是

p,指示

pte是已分配、快取還是未快取的。

問題:pte表是如何分配的,

pgd表項的值是如何確定的?

答:乙個程式剛剛執行,還未建立

pte表,(注意

pte表是按需分配,如果沒有線性位址的轉換需要用到這個

pte,

作業系統是不會分配空間給它的

)現來了個線性位址,假設高

10位為

x,還沒有

pte表,就觸發乙個異常,作業系統會為其分配乙個

4k位元組的物理頁面用以存放

pte表,(注意所有高

10位為

x的線性位址都會對映到這個

pte表),現在假設又有一高

10位為

x,不同低

10的線性位址請求過來解析,因為作業系統已經為此分配了此

pte表,那

p位就已經被作業系統標識為已分配,直接拿此

pte錶用就行了。再假設此頁被換頁換走了,

p位就會被標識為快取,要用的時間交換進來就行了。

pgd表項的值就是根據動態分配到的

pte表的實體地址填寫的

,所以每個表項的值是不一樣的! 步驟

4。找到

pte後,乙個

pte表共有

1024

項,每項32位

4位元組,

cpu取其前

20位,在這

20位後面自動加上

12個零,以此為基址,加上線性位址的低

12位,得到最後的實體地址。

問題:為什麼只取前

20位,後

12位做什麼的?

答:這與上面的相似,因為每個

物理頁面

都是4k

位元組對齊的,本來低

12位是用來定位這乙個物理頁面

4k中的某乙個位置,現實體地址都是

4k位元組對齊的,那低

12可以另做他用。

linux

將其用來做標誌位,其中最重要的乙個標誌位是

p,指示

pte是已分配、快取還是未快取的。

問題:物理頁面是如何分配的,

pte表項的值是如何確定的?

答:乙個程式剛剛執行,還未建立物理頁面,(注意

物理頁數面是按需分配,如果沒有線性位址的轉換需要用到這個物理頁面

, 作業系統是不會分配空間給它的

)現來了個線性位址,假設高

20位為

y,還沒有物理頁面,就觸發乙個異常,作業系統會為其分配乙個

4k位元組的物理頁面,

(注意現所有高

20位為

y的線性位址都會對映到這個物理頁面,只是根據線性位址低

12位的不同定位到這一物理頁面的

4k的相應位置

),現在假設又有一高

20位為

y,不同低

12的線性位址請求過來解析,因為作業系統已經為此分配了物理頁面,那

p位就已經被作業系統標識為已分配,直接拿此物理頁面用就行了。再假設此頁被換頁換走了,

p位就會被標識為快取,要用的時間交換進來就行了(這與深入理解就聯絡起來了吧!)

pte表項的值就是根據動態分配到的最終的實體地址填寫的

,所以每個表項的值是不一樣的!

總結:相同的虛擬位址,根據以上對映關係,動態分配物理頁面,肯定不會分配到相同的實體地址上去的。

乙個程式只有乙個

pgd,

如果4g

空間都用到的話,會有

1024

個pte

表,但通常肯定不會用到那麼多

pte表的。

線性位址和實體地址

在保護模式下32位 還是採用段機制訪問記憶體 初始化臨時的要進入到ia 32e模式的gdt資料結構 label gdt64 dq 0x0000000000000000 label desc code64 dq 0x0020980000000000 label desc data64 dq 0x000...

邏輯位址,線性位址,實體地址

邏輯位址轉線性位址 機器語言指令中出現的記憶體位址,都是邏輯位址,需要轉換成線性位址,再經過 mmu cpu中的記憶體管理單元 轉換成實體地址才能夠被訪問到。我們寫個最簡單的 hello world 程式,用 gcc 編譯,再反彙編後會看到以下指令 mov 0x80495b0 eax 這裡的記憶體位...

原 線性位址到實體地址轉換後記

之前想手動查詢線性位址對應的實體地址,以更好的理解作業系統的分頁機制,cr3的值和指定程序的eprocess的值總是對不上。具體參考筆記 原 線性位址到實體地址轉換 今天突然靈光一閃,想起來張老師說過的關於cr3的相關知識,cr3是作業系統在切換程序的時候才會更新的,我們用.process p 指定...