Выделяет ли процесс предварительно память кучи и стека при разделении ее на страницы? Если да, то будут ли изначально все эти страницы пустыми?

1
chaos 7 Фев 2020 в 12:45

1 ответ

Лучший ответ

Процессы (или ядро, действующее от имени процессов) предварительно выделяют адресное пространство, а не страницы. Когда процесс выделяет память, выделяются соответствующие записи таблицы страниц и инициализируется для указания на нулевую страницу (за исключением архитектур, которые это запрещают). Нулевая страница настроена так, чтобы возвращать все нули при чтении и ошибку при записи — тогда обработчик ошибок выделяет отдельную физическую страницу.

4
Stephen Kitt 7 Фев 2020 в 13:17
Tnx @Stephen, таблица карты страниц должна иметь запись, равную количеству страниц в процессе, верно? или таблица карт страниц будет динамически расти?
 – 
Karthik Nedunchezhiyan
7 Фев 2020 в 12:57
Ах да, вас интересует распределение PTE; Я обновил свой ответ, чтобы решить эту проблему.
 – 
Stephen Kitt
7 Фев 2020 в 13:18
Tnx @Stephen, теперь я понимаю. Просто любопытно узнать, что «Нулевая страница настроена на возврат всех нулей при чтении», чтение также должно вызывать ошибку страницы, верно?
 – 
Karthik Nedunchezhiyan
7 Фев 2020 в 14:15
Нет, потому что пока вы не записываете на страницу, операции чтения должны возвращать ноль, поэтому нет необходимости специально обрабатывать операции чтения.
 – 
Stephen Kitt
7 Фев 2020 в 14:37
1
Нулевая страница отображается только для чтения. Любые попытки записи вызывают ошибку страницы; затем ядро ​​сопоставляется с другой страницей, обновляет PTE и перезапускает запись на новую страницу, а последующие чтения происходят с новой страницы.
 – 
Stephen Kitt
7 Фев 2020 в 14:50