|
通過前面兩個(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)換上圖是32位線性地址最終轉(zhuǎn)換為4K頁物理地址的過程:
經(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)換上圖是32位線性地址最終轉(zhuǎn)換為4M頁物理地址的過程:
經(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)換線性地址被分割成了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)換在支持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)換
2M頁的地址轉(zhuǎn)換
1G頁的地址轉(zhuǎn)換
64位的地址分頁 - 5級(jí)分頁 |
|
|