gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:49:05 25 4
gpt4 key购买 nike

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

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

问题是:

  • 为什么要这么做?
  • 为什么所有进程不能共享一个内核页面副本表(关于 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));

最佳答案

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

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

关于c - "fork"ing一个进程时,为什么Linux内核会为每个新创建的进程复制内核页表的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27222060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com