Я перерыл много ресурсов, но ничего конкретного по этому поводу не нашел:
Я знаю, что в некоторых Linux-системах системный вызов fork()
работает с копированием при записи; то есть родительский и дочерний элементы используют одно и то же адресное пространство, но PTE теперь помечен как только для чтения и будет использоваться позже COW. когда любой из них пытается получить доступ к странице, происходит PAGE_FAULT
, и страница копируется в другое место, где ее можно изменить.
Однако я не могу понять, как ОС достигает общих PTE, чтобы пометить их как «прочитанные». Я предположил, что когда происходит системный вызов fork()
, ОС выполняет "прогулку по странице" в родительской таблице страниц и помечает их как доступные только для чтения, но я не нахожу ни подтверждения этому, ни какой-либо информации относительно процесс.
Кто-нибудь знает, как страницы помечаются как только для чтения? Будем признательны за любую помощь. Спасибо!
do_fork
-›copy_process
-›copy_mm
-›dup_mm
-›dup_mmap
... Здесь мне не удалось получить точную строку, поэтому поисковая машина Интернета дает подсказку для fork+COW+dup_mm как gist.github.com/cwshu/7d52bc993525c1bb7df1 - так что настоящая работа находится в строкеretval = copy_page_range(mm, oldmm, mpnt);
- проверьте mm/memory.c#L1005 - person osgx   schedule 24.02.2020