#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的那段映射都是一样的。
其实也就解释了为什么说每个进程虽然有各自独立的用户虚拟空间,但是公用内核或者说系统内存空间。