在" fork一个进程的同时,为什么Linux内核会为每个新创建的进程复制内核页表的内容?

时间:2014-12-01 05:10:50

标签: c linux memory-management linux-kernel arm

以下讨论适用于32位ARM Linux内核。

我注意到在分叉过程中,Linux内核将内核页表(主页表,即 swapper_pg_dir )的内容复制到每个新创建的进程的页表中。

问题是:

  • 为什么这么做呢?
  • 为什么不能所有进程共享内核页面的单个副本 table(关于32位ARM Linux的高分1G部分),而不是memcpy 每个新创建的进程的交换器页表?
  • 是浪费记忆吗?

相关源代码(“ - >”代表函数调用):
do_fork - > copy_process - > copy_mm - > dup_mm - > mm_init - > mm_alloc_pgd - > pgd_alloc - >

/*
* Copy over the kernel and IO PGD entries
*/
init_pgd = pgd_offset_k(0);

memcpy(new_pgd + USER_PTRS_PER_PGD, init_pgd + USER_PTRS_PER_PGD,
       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));

2 个答案:

答案 0 :(得分:4)

每个进程都有自己的内核部分页面表副本(更高的1GB),以避免在切换用户/内核域时进行L1页表切换(即避免更新TTBR)。请注意,用户/内核切换频繁发生。

为什么要避免更新TTBR?详细信息可以在这里找到: What is the downside of updating ARM TTBR(Translate Table Base Register)?

答案 1 :(得分:1)

共享页面表意味着共享内存空间。换句话说,它打破了拥有操作系统的重点。每个流程都有自己的页面故事。页表不占用太多内存。