Linux:頁表中PGD、PUD、PMD等概念介紹

1、PGD: Page Global Directory

Linux系統中每個進程對應用戶空間的pgd是不一樣的,但是linux內核 的pgd是一樣的。當創建一個新的進程時,都要為新進程創建一個新的頁面目錄PGD,並從內核的頁面目錄swapper_pg_dir中複製內核區間頁面目錄項至新建進程頁面目錄PGD的相應位置,具體過程如下:do_fork() --> copy_mm() --> mm_init() --> pgd_alloc() --> set_pgd_fast() --> get_pgd_slow() --> memcpy(&PGD + USER_PTRS_PER_PGD, swapper_pg_dir +USER_PTRS_PER_PGD, (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t))

這樣一來,每個進程的頁面目錄就分成了兩部分,第一部分為“用戶空間”,用來映射其整個進程空間(0x0000 0000-0xBFFF FFFF)即3G字節的虛擬地址;第二部分為“系統空間”,用來映射(0xC000 0000-0xFFFF FFFF)1G字節的虛擬地址。可以看出Linux系統中每個進程的頁面目錄的第二部分是相同的,所以從進程的角度來看,每個進程有4G字節的虛擬空間,較低的3G字節是自己的用戶空間,最高的1G字節則為與所有進程以及內核共享的系統空間。每個進程有它自己的PGD( Page Global Directory),它是一個物理頁,幷包含一個pgd_t數組。 關鍵字:

  • PTE: 頁表項(page table entry)
  • PGD(Page Global Directory)
  • PUD(Page Upper Directory)
  • PMD(Page Middle Directory)
  • PT(Page Table)

PGD中包含若干PUD的地址,PUD中包含若干PMD的地址,PMD中又包含若干PT的地址。每一個頁表項指向一個頁框,頁框就是真正的物理內存頁。


分享到:


相關文章: