進入內核態CR3會修改嗎?

進入內核態CR3會修改嗎?

不會修改,同時可以解釋"copy_from_uesr" 和"copy_to_user"介面在沒有缺頁的情況下可以完全由memcpy代替。

*進程定址空間0~4G

*進程在用戶態只能訪問0~3G,只有進入內核態才能訪問3G~4G

*進程通過系統調用進入內核態

*每個進程虛擬空間的3G~4G部分是相同的

*進程從用戶態進入內核態不會引起CR3的改變但會引起堆棧的改變

當創建一個新的進程時,都要為新進程創建一個新的頁面目錄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位元組則為與所有進程以及內核共享的系統空間。


推薦閱讀:

TAG:操作系統 | Linux |