1、PGD: Page Global Directory Linux系統中每個進程對應用戶空間的pgd是不一樣的,但是linux內核 的pgd是一樣的。當創建一個新的進程時,都要為新進程創建一個新的頁面目錄PGD,並從內核的頁面目錄swapper_pg_dir中複製內核區間頁面目錄項至新建進程頁面目 ...
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的地址。每一個頁表項指向一個頁框,頁框就是真正的物理記憶體頁。