小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

x86_64內(nèi)存尋址 - 分頁

 張宏韜 2021-04-24

通過前面兩個(gè)章節(jié)我們知道了實(shí)地址尋址分段尋址,在這個(gè)章節(jié)我們將介紹分頁尋址,在前面的文章我們知道,處理器訪問內(nèi)存的一個(gè)字節(jié),首先將邏輯地址轉(zhuǎn)換為線性地址,如果分頁功能打開,那么線性地址會(huì)轉(zhuǎn)換為最終的物理地址。在打開分頁功能的處理器上,我們?yōu)榱苏业絻?nèi)存中的一個(gè)字節(jié),一般經(jīng)歷了兩個(gè)過程,即邏輯地址經(jīng)過分段轉(zhuǎn)化為線性地址線性地址經(jīng)過分頁轉(zhuǎn)換為物理地址。分段和分頁都有權(quán)限檢查,而且有些是重合的,所以很多操作系統(tǒng)并沒有使用處理器強(qiáng)大的權(quán)限檢查,而只是選擇使用分頁權(quán)限檢查。

32位的地址分頁

處理器在 CR0.PG = 1 并且 CR4.PAE = 0 的情況下將使用32位的分頁,在這里將詳細(xì)的講述32位地址的分頁轉(zhuǎn)換,32地址的分頁支持4K和4M的頁。4K表示在一個(gè)頁支持4K空間的尋址。同理4M的頁表示支持4M的內(nèi)存尋址空間。現(xiàn)代處理器物理地址最大支持40位的地址空間,達(dá)到1TB,但由于線性地址寬度為32位,所以在一個(gè)應(yīng)用最大可用的內(nèi)存空間仍是2^32-1。

分頁就像在字典中查找單詞一樣,首先我們根據(jù)首字母在目錄中找到對應(yīng)的頁碼,然后通過頁碼定位到最終的單詞。處理器在將邏輯地址轉(zhuǎn)換為線性地址后,首先根據(jù) CR3 寄存器獲得第一個(gè)頁目錄,通常處理器會(huì)根據(jù)物理內(nèi)存的大小決定映射的層級(jí)。下面我們將分別描述 4K頁的地址轉(zhuǎn)換,4M頁的地址轉(zhuǎn)換,支持PAE的地址轉(zhuǎn)換。

4K頁的地址轉(zhuǎn)換

x86_64內(nèi)存尋址 - 分頁

上圖是32位線性地址最終轉(zhuǎn)換為4K頁物理地址的過程:

  • 處理器通過將 CR3 寄存器的 [31:12] 和偏移量共同計(jì)算出PDE的地址,一個(gè)頁目錄包含1024個(gè)32位的PDE,一個(gè)32位的PDE物理地址由以下規(guī)則計(jì)算: [39:32] 為0 [31:12] 來源于 CR3 [12:2] 來源于線性地址的[31:22]位 [1:0] 為0
  • 如果 CR4.PSE=0 且 PDE.PS=0 那么映射的是一個(gè)4K的頁,經(jīng)過上個(gè)過程我們得到的物理地址地址存放了一個(gè)叫做頁表的數(shù)據(jù)結(jié)構(gòu),這是因?yàn)橹С?K的頁大小的轉(zhuǎn)換還需要經(jīng)過一層轉(zhuǎn)換,這個(gè)過程使用的數(shù)據(jù)結(jié)果叫做頁表,頁表中包含1024個(gè)32位的PTE,線性地址找到對應(yīng)PTE的地址過程為: [39:32] 為0 [31:12] 來源于PDE [11:2] 來源于線性地址的[21:12] [1:0] 為0
  • 然后得到PTE的物理地址,PTE也是頁轉(zhuǎn)換的中間數(shù)據(jù)結(jié)構(gòu),最終由PTE和線性地址共同計(jì)算出最終的物理地址: [39:32] 為0 [31:12] 來源于PTE [11:0] 來源于線性地址

經(jīng)過以上步驟得到物理地址就是處理器訪問一個(gè)地址在支持分頁功能需要尋址的過程。`PTE.P`表示數(shù)據(jù)是否在內(nèi)存中,如果這個(gè)位沒有被置位,表明數(shù)據(jù)不在內(nèi)存中,訪問這個(gè)地址會(huì)導(dǎo)致處理器觸發(fā)頁錯(cuò)誤異常,而操作系統(tǒng)的按需取頁通常都是按照這個(gè)特性實(shí)現(xiàn)的。

4M頁的地址轉(zhuǎn)換

x86_64內(nèi)存尋址 - 分頁

上圖是32位線性地址最終轉(zhuǎn)換為4M頁物理地址的過程:

  • 處理器通過將 CR3 寄存器的 [31:12] 和偏移量共同計(jì)算出PDE的地址,一個(gè)頁目錄包含1024個(gè)64位的PDE,一個(gè)32位的PDE物理地址由以下規(guī)則計(jì)算: [31:12] 來源于 CR3 [12:2] 來源于線性地址的[31:22]位 [1:0] 為0
  • 如果 CR4.PSE=1 且 PDE.PS 也是1,那么PDE映射的是一個(gè)4M的頁,由于還沒有使用的[21:0]正好是4M的大小,所以在支持4M的頁在此層級(jí)上直接映射為最終的物理地址 [39:32] 來源于PDE的[20:13] [31:12] 來源于PDE的[31:22] [21:0] 來源于線性地址的[21:0]

經(jīng)過第二不我們得到了一個(gè)32位寬度的物理地址,這個(gè)地址就是最終訪問內(nèi)存的地址。

支持PAE的32位地址轉(zhuǎn)換

處理器在 CR0.PG = 1, CR4.PAE = 1, IA32_EFER.LME = 0,將打開PAE功能,這個(gè)功能支持將32位的線性地址轉(zhuǎn)換為52位的物理地址。和之前說的一樣,由于線性地址只有32位,所以最大訪問的空間為2^32-1。為了實(shí)現(xiàn)這個(gè)功能,處理器提供了4個(gè)PDPTE寄存器。將線性地址分為了4個(gè)部分,每個(gè)部分1G。

當(dāng)打開PAE功能時(shí),CR3 不再應(yīng)用PDE的地址,而是引用的是 PDPT(page-directory-pointer table)。這個(gè)表引用了4個(gè) PDPTE 寄存器,每個(gè)寄存器管理1G的空間,分別叫`PDPTE0`, PDPTE1, PDPTE2, 和 PDPTE3。

PAE頁映射支持4K和2M的頁大小,下面將詳細(xì)的描述PAE如何將32位的線性地址轉(zhuǎn)換為52位的物理地址。

4K頁的地址轉(zhuǎn)換

x86_64內(nèi)存尋址 - 分頁

線性地址被分割成了PDPTE偏移量,頁目錄,頁表和偏移量。4K的頁通過以下步驟找到最終的物理地址: - 線性地址的[31:30]用于選擇使用哪一個(gè)PDPTE寄存器,通過這個(gè)值找到最終使用的是哪個(gè)PDPTEi,i表示這兩位的索引值。使用 CR3 寄存器和這個(gè)索引值找到最終的PDPTEi,如果 PDPTE.P 沒有被置位,表明這個(gè)地址空間沒有被映射,訪問這個(gè)空間將導(dǎo)致頁錯(cuò)誤異常 - 如果 PDPTE.P 被置位了,那么PDPTE將指向一個(gè)4K大小的頁目錄。處理器將使用以下規(guī)則找到最終的頁目錄 * [51:12] 來自PDPTEi寄存器 * [11:3] 來自線性地址的[29:21] * [2:0] 為0 - 由于剩下的線性地址[20:0]還沒有被使用,所以處理器可以最大控制2M的內(nèi)存空間,如果PDE.PS標(biāo)志是0,表示映射的是4K大小的頁,所以和32位映射一樣,處理器繼續(xù)尋址到頁表,頁表地址的計(jì)算方式如下: * [51:12] 來自PDE * [11:3] 來自線性地址的[20:12] * [2:0] 為0 - 現(xiàn)在只有偏移量還沒有被使用,偏移量用于尋址4K大小的內(nèi)存空間,通過頁表和偏移量共同計(jì)算出最終訪問的物理地址 * [51:12] 來自PTE * [2:0] 為0

2M頁的地址轉(zhuǎn)換

x86_64內(nèi)存尋址 - 分頁

在支持2M的頁大小的分頁機(jī)制中,線性地址被分為了PDPTE偏移量,頁目錄,偏移量。和之前相比減少一個(gè)頁目錄數(shù)據(jù)結(jié)構(gòu)。2M的頁通過以下步驟找到最終的物理地址: - 線性地址的[31:30]用于選擇使用哪一個(gè)PDPTE寄存器,通過這個(gè)值找到最終使用的是哪個(gè)PDPTEi,i表示這兩位的索引值。使用 CR3 寄存器和這個(gè)索引值找到最終的PDPTEi,如果 PDPTE.P 沒有被置位,表明這個(gè)地址空間沒有被映射,訪問這個(gè)空間將導(dǎo)致頁錯(cuò)誤異常 - 如果 PDPTE.P 被置位了,那么PDPTE將指向一個(gè)4K大小的頁目錄。處理器將使用以下規(guī)則找到最終的頁目錄項(xiàng) * [51:12] 來自PDPTEi寄存器 * [11:3] 來自線性地址的[29:21] * [2:0] 為0 - 處理器通過以下規(guī)則尋址最終的物理地址 * [51:12] 來自PDE * [20:0] 來自線性地址

64位的地址分頁 - 4級(jí)分頁

當(dāng) CR0.PG = 1, CR4.PAE = 1, 且 IA32_EFER.LME = 1,處理器將使用64位的分頁模式。64位的分頁模式支持更大的尋址空間,頁更加復(fù)雜。同樣,它也是先從 CR3 寄存器獲取頁的基址信息,參與各級(jí)的分頁計(jì)算。處理器將線性地址提高到了48位,物理地址最大支持52位的地址空間,需要注意,處理器仍然只支持48位的規(guī)范地址,也就是說線性地址空間限制在48位,但仍可尋址52位的物理地址空間。

64位處理器使用更加深的層級(jí)轉(zhuǎn)換,`CR3`寄存器用于定位`PML4`表。64位處理器支持4K,2M,1G的頁大小。

4K頁的地址轉(zhuǎn)換

x86_64內(nèi)存尋址 - 分頁
  • 處理器通過 CR3 寄存器獲得 `PML4`表結(jié)構(gòu),一個(gè)`PML4`表是包含512個(gè)64位表項(xiàng)(PLM4Es)的數(shù)據(jù)結(jié)構(gòu),處理器通過以下規(guī)則計(jì)算出需要的PLM4Es的地址(由于使用線性地址的[47:39],所以每一個(gè)表項(xiàng)可以訪問512GB的內(nèi)存空間): [51:12] 來自CR3 [11:3] 來自線性地址的[47:39] [2:0] 為0
  • 通過上面計(jì)算的地址指向一個(gè)4K大小的PLM4E,處理器需要通過PLM4E找到頁目錄的物理地址(由于使用線性地址的[47:30],所以每一個(gè)表項(xiàng)可以訪問1GB的內(nèi)存空間) [51:12] 來自PML4E [11:3] 來自線性地址的[38:30] [2:0] 為0
  • 如果`PDPTE.PS` 沒有被置位,說明這個(gè)地址指向了頁目錄(PDPTE)。一個(gè)頁目錄由512個(gè)64位的PDPTE組成,一個(gè)PDPTE的地址由以下規(guī)則計(jì)算而成: [51:12] 來自PDPTE [11:3] 來自線性地址的[29:21] [2:0] 為0
  • 如果 PDE.PS 沒有被置位,說明PDE映射的是頁表,每個(gè)頁表512個(gè)64位的PTE組成,一個(gè)PTE的物理地址計(jì)算方式如下(由于使用了線性地址的[47:12],所以每一個(gè)表項(xiàng)管理了4K的內(nèi)存空間): [51:12] 來自PDE [11:3] 來自線性地址的[20:12] [2:0] 為0
  • 最后獲得了PTE,最終由PTE和偏移量計(jì)算的物理地址: [51:12] 來自PTE [11:0] 來自線性地址

2M頁的地址轉(zhuǎn)換

x86_64內(nèi)存尋址 - 分頁
  • 處理器通過 CR3 寄存器獲得 `PML4`表結(jié)構(gòu),一個(gè)`PML4`表是包含512個(gè)64位表項(xiàng)(PLM4Es)的數(shù)據(jù)結(jié)構(gòu),處理器通過以下規(guī)則計(jì)算出需要的PLM4Es的地址(由于使用線性地址的[47:39],所以每一個(gè)表項(xiàng)可以訪問512GB的內(nèi)存空間): [51:12] 來自CR3 [11:3] 來自線性地址的[47:39] [2:0] 為0
  • 通過上面計(jì)算的地址指向一個(gè)4K大小的PLM4E,處理器需要通過PLM4E找到頁目錄的物理地址(由于使用線性地址的[47:30],所以每一個(gè)表項(xiàng)可以訪問1GB的內(nèi)存空間) [51:12] 來自PML4E [11:3] 來自線性地址的[38:30] [2:0] 為0
  • 如果`PDPTE.PS` 沒有被置位,說明這個(gè)地址指向了頁目錄(PDPTE)。一個(gè)頁目錄由512個(gè)64位的PDPTE組成,一個(gè)PDPTE的地址由以下規(guī)則計(jì)算而成(由于使用了線性地址的[47:21],所以每一個(gè)表項(xiàng)管理了2M的內(nèi)存空間): [51:12] 來自PDPTE [11:3] 來自線性地址的[29:21] [2:0] 為0
  • 如果 PDE.PS 被置位,說明PDE映射的是2M的頁,最終的物理內(nèi)存計(jì)算如下: [51:12] 來自PDE [20:0] 來自線性地址的

1G頁的地址轉(zhuǎn)換

x86_64內(nèi)存尋址 - 分頁
  • 處理器通過 CR3 寄存器獲得 `PML4`表結(jié)構(gòu),一個(gè)`PML4`表是包含512個(gè)64位表項(xiàng)(PLM4Es)的數(shù)據(jù)結(jié)構(gòu),處理器通過以下規(guī)則計(jì)算出需要的PLM4Es的地址(由于使用線性地址的[47:39],所以每一個(gè)表項(xiàng)可以訪問512GB的內(nèi)存空間): [51:12] 來自CR3 [11:3] 來自線性地址的[47:39] [2:0] 為0
  • 通過上面計(jì)算的地址指向一個(gè)4K大小的PLM4E,處理器需要通過PLM4E找到頁目錄的物理地址(由于使用線性地址的[47:30],所以每一個(gè)表項(xiàng)可以訪問1GB的內(nèi)存空間) [51:12] 來自PML4E [11:3] 來自線性地址的[38:30] [2:0] 為0
  • 如果 PDPTE.PS 被置位,那么 PDPTE 映射了一個(gè)1G的頁,最終物理地址計(jì)算為: [51:30] 來自PDPTE [29:0] 來自線性地址

64位的地址分頁 - 5級(jí)分頁

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多