“不管什么进程,一旦进入了系统空间,都有相同的页面映射”之解疑

    技术2026-08-08  6

    #define PGDIR_SHIFT 22 #define PGDIR_SIZE (1UL << PGDIR_SHIFT) #define TASK_SIZE (PAGE_OFFSET) #define __PAGE_OFFSET (0xC0000000) #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) //函数调用流程是这样的: //sys_fork->do_fork->copy_mm->mm_init->pgd_alloc->get_pgd_fast->get_pgd_slow static inline pgd_t *get_pgd_slow(void) { pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL); if (pgd) { memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); memcpy(pgd + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD, (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); } return pgd; } 从而得知:每个进程的页表中,3G~4G的那段映射都是一样的。

    其实也就解释了为什么说每个进程虽然有各自独立的用户虚拟空间,但是公用内核或者说系统内存空间。

    最新回复(0)