При «разветвлении» процесса, почему ядро Linux копирует содержимое таблицы страниц ядра для каждого вновь созданного процесса?
Обсуждение ниже относится к 32-битному ядру ARM Linux.
Я заметил, что в процессе разветвления ядро Linux копирует содержимое таблицы страниц ядра (таблицы основных страниц, т.е.swapper_pg_dir) в таблицу страниц каждого вновь созданного процесса.
Вопросы:
Зачем это делать?Почему все процессы не могут совместно использовать одну копию таблицы страниц ядра (более высокая часть 1G для 32-битной ARM Linux) вместо 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));