В то время как «развивает» процесс, почему kernel ​​Linux копирует содержимое таблицы страниц ядра для каждого вновь созданного процесса?

Нижеприведенное обсуждение относится к 32-разрядному ядру ARM Linux.

Я заметил, что во время процесса forking kernel ​​Linux копирует содержимое таблицы страниц ядра (главная страница таблицы, т.е. swapper_pg_dir ) в таблицу страниц каждого вновь созданного процесса.

Вопросы:

  • Зачем это делать?
  • Почему все процессы не могут совместно использовать одну копию таблицы страниц ядра (более высокая часть 1G для 32-разрядного ARM Linux) вместо memcpy таблицы страниц swapper для каждого вновь созданного процесса?
  • Это пустая трата памяти?

Связанный исходный код («->» означает вызов функции):
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)); 

Каждый процесс, имеющий собственную копию таблицы страниц для части ядра (выше 1 ГБ), должен избегать переключения таблицы страниц L1 (т. Е. Избегать обновления TTBR) при переключении земли пользователя / ядра. Обратите внимание, что переход между пользователем и kernelм происходит довольно часто.

Почему избежать обновления TTBR? Подробности можно найти здесь: Какая минута обновления ARM TTBR (Базовый регистратор таблицы переводов)?

Совместное использование таблиц страниц означает совместное использование памяти. Другими словами, он побеждает в том, что имеет операционную систему. Каждый процесс имеет свои собственные сценарии. Таблицы страниц не используют много памяти.