Что находится в поле адреса PTE для анонимно сопоставленной страницы?

Когда программа вызывает mmap для выделения анонимной страницы, также известной как страница с нулевым запросом, что появляется в поле адреса соответствующей записи таблицы страниц (PTE)? Я предполагаю, что ядро не создает страницу с нулевой инициализацией в физической памяти (и не вводит номер страницы этой физической страницы в PTE) до тех пор, пока запрашивающий процесс не коснется страницы - отсюда и термин нулевое требование. Поскольку это не будет адрес диска и не будет 0 (что для нераспределенных страниц), какое значение там появится? В качестве другого, но связанного вопроса, как ядро ​​«знает», что эта страница должна обрабатываться как страница с нулевым потреблением, т. Е. Что обработчик ошибок должен найти физическую страницу и инициализировать ее с помощью 0, а не копировать страницу из диск?

1 ответ

Я предполагаю, что ядро ​​не создает страницу с нулевой инициализацией в физической памяти.

Действительно, обычно так и есть. За исключением особых случаев, например, если указывается для явного запроса инициализации страницы (также называемой «предварительной обработкой»).

что появляется в поле адреса соответствующей записи таблицы страниц (PTE)?

Сразу после того, как у вас даже нет PTE, выделенного для страницы (или вообще у вас нет записи на любом уровне таблицы страниц). Что касается ЦП, то страница даже не существует. Если бы вы прошлись по таблице страниц, вы бы просто дошли до точки (на произвольном уровне), где соответствующая запись помечена как «отсутствующая».

Поскольку это не адрес диска и не 0 (для нераспределенных страниц), какое значение там появится?

Что касается процессора, страница не распределена. При ошибке первой страницы могут произойти две вещи:

  1. При сбое чтения страницы PTE обновляется, чтобы указать на нулевую страницу : это специальная страница, которая всегда полностью обнуляется и на которую указывают PTE любой анонимной (нулевой) страницы в системе, которая имеет еще не был изменен.
  2. В случае ошибки записи страницы будет выделена реальная физическая страница, и соответствующий PTE будет обновлен, чтобы указать на ее физический адрес.

Цитата непосредственно из документации :

Анонимная память или анонимные сопоставления представляют собой память, которая не поддерживается файловой системой. Такие отображения создаются неявно для стека и кучи программы или явными вызовами системного вызова mmap(2). Обычно анонимные сопоставления определяют только области виртуальной памяти, к которым программе разрешен доступ. Доступ для чтения приведет к созданию записи в таблице страниц, которая ссылается на специальную физическую страницу, заполненную нулями. Когда программа выполняет запись, для хранения записанных данных выделяется обычная физическая страница. Страница будет помечена как грязная, и если ядро ​​решит перепрофилировать ее, грязная страница будет заменена.


как ядро ​​«узнает», что эта страница должна обрабатываться как страница с нулевым спросом, т. е. что обработчик ошибок должен найти физическую страницу и инициализировать ее 0, а не копировать страницу с диска?

Когда происходит ошибка страницы, обработчик ошибок страницы ядра (зависит от архитектуры ) определяет, какому VMA принадлежит страница, и извлекает соответствующий(который был создан ранее либо самим ядром, либо системный вызов). Затем эта структура передается независимому от архитектуры коду (do_fault()) вместе с необходимой информацией о неисправности (struct vm_fault).

The затем содержит всю оставшуюся необходимую информацию для обработки неисправности (например, поле, которое в случае файлового сопоставления). Поле указывает наstruct vm_operations_structкоторый определяет набор указателей на функции для вызова в различных случаях. В частности, анонимные VMA имеют .

Для других типов страниц функция, используемая при обработке ошибки страницы. Эта функция знает, что проверять и как на самом деле обрабатывать ошибку.

B & O также описывают VMA, но не объясняют, как ядро ​​может использовать VMA, чтобы различать, скажем, нераспределенную страницу и выделенную страницу, которая должна быть создана и инициализирована нулями.

Просто, просто проверьте и в таком случае вы знаете, что страница является анонимной страницей с нулевым спросом. Затем при ошибке страницы действуйте по мере необходимости (прочитать ошибку -> обновить PTE, чтобы указать на глобальную нулевую страницу, записать ошибку -> выделить страницу и обновить PTE).

Другие вопросы по тегам