考慮乙個線性位址轉換實體地址的過程

2021-06-22 22:47:37 字數 2447 閱讀 2353

考慮乙個線性位址轉換實體地址的過程

在32位平台傷,

如果乙個線性位址位:

00011010 0011 1000 0100 1100 0001 0001(

a),

根據cr3找到頁目錄(考慮在

linux0.1x下面只有乙個頁目錄表的情況下)。根據線性位址的高

10位即

00011010 00(

aa),在

頁目錄表中索引,找到其頁表的位址,假設第

0001101000項的值位

0011 10001010 1001 0100 0101 0011 0100(

b) ,這個值就是表示這個程序的頁表的首地值,從而可以找到頁表的位置。

然後,取線性位址的中間

10位,即

111000 0100,從頁表中開始索引,找到其

1110000100項,假設,這個位置是

00000011 0111 1010 1000 1100 1001 0001(

c),這就是代表這這個線性位址所對映的物理頁面的基位址,

然後,把線性位址的後

12位取出,即

11000001 0001,然後加上這個基位址。 即

0000 00110111 1010 1000 1100 1001 0001 + 1100 0001 0001=最後的實體地址,

over。

在索引頁目錄或者頁表的時候,由於每個頁目錄項或頁表項都是

32位的位址,即

4b,在**中,可以用高

10位(索引頁目錄項時候)或中間

10位(索引頁表項時候)

<<2即乘以

4的方式得到。例如例子中, 得到

b的值,可以用

aa*4+cr3的值,然後從這個位址中取出,就是

b。起始也可頁用數的方式,即從頁目錄中數

aa個項,一樣的。 續:

1,在32位平台上,線性位址和實體地址都是

32位的,只不過表示的大小不同。

2,本例子中的數字不一定符合真實情況,只是為了說明邏輯關係。

3,在真實的情況下,所有的頁目錄項和頁表項的後面12位,和位址表示沒有關係,是頁的管理屬性,

即使它們不為0,在找頁的時候,也會把後面12位當作0來找頁,比如位址b,0011 10001010 1001 0100 0101 0011 0100(

b),它要如何找到所對應的頁的位址呢?即把後面12位全部看作0就可以了,即真實的頁的位址在

0011 10001010 1001 0100 0000 0000 0000 處(這是實體地址)。後面的12位表示這個頁的一些屬性,所以,不要困惑。

補兩張圖

補充:*******重要。

我們說每個程序有0-3g的線性空間,3g-4g是核心空間。那麼具體來說是個什麼意思呢?還是看上面的那張頁目錄和頁表的大圖,這張圖很好。

其實,每個程序的頁目錄中,前面從

0-767項是剛好對映到了

3gb=768*4m=3gb.

768-1023項剛好映**

256*4m=1gb

大概就是這麼個情況,那麼,既然核心只有乙個,即核心空間中的

東西每個程序看到的都是一樣的。

所以,每個程序的頁目錄

0-767項不一樣,但

768-1023項都是一樣的,

即共享核心。就是這麼個意思。

程序

0因為不會進入使用者空間,它的前

768項是空的,只有後面才有東西。

每個程序通過中斷或者系統呼叫,進入核心空間,就用到了後面的項來對映,且都是一樣的。

線性位址和實體地址

在保護模式下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 指定...