2016-08-04 2 views
1
char *p = (char*) mmap(...); 
....; /* check if p is not -1 */ 
a = *p; 

При запуске последней инструкции возникает ошибка страницы. Обработчик ошибок в ядре будет выделять страницу в физической памяти и скопировать 4K байт из файла на эту страницу, а затем изменить запись страницы. Инструкция, которая читает *p, будет выполнена снова, успешно на этот раз.Где находится путь к файлу после вызова mmap?

Но как обработчик ошибок знает имя файла и путь, связанный со страницей. Где хранится имя файла (или fd)? И смещение в файле.

Что делать, если страница в сегменте данных процесса поменялась (в файл подкачки, я думаю)? Как ядро ​​знает, где копировать, когда страница должна быть заменена позже?

ответ

0

Обработчик не знает имя файла или путь, потому что он не использует их (вы можете сказать, потому что даже если файл удаляется из файловой системы после создания сопоставления, отображение продолжается до работа прекрасна, содержимое файла остается в силе до тех пор, пока все открытые дескрипторы файлов и отображение памяти не будут закрыты).

Он также не использует fd; вам разрешено использовать closefd, переданный mmap сразу после вызова mmap, и отображение остается в силе (это действительно необходимо для некоторых систем с низким ulimit с для открытых файлов файлов, вы можете отображать 10 000 файлов одновременно, но вы не удалось открыть fd s для всех из них, если ulimit для fds был 1000).

Случается, что при mmap время диспетчер виртуальной памяти для ОС настраивает кучу виртуальных таблиц памяти, которые в основном говорят, что «эта память поддерживается следующими секторами диска». Он использует очень похожий процесс при извлечении данных, которые были записаны в файл подкачки, и их необходимо прочитать. Единственные различия в том, насколько агрессивно хранятся память и диск, независимо от того, является ли отображение в конкретный сектор диска статичным или динамическим (хотя даже для «реальных» файлов сектор диска может меняться по мере запуска, например, при записи в файловую систему с копированием на запись), следует ли записывать память (свопировать) или просто удалять (mmap -ed файл без грязных страниц) под давлением памяти и т. д.

Существует несколько уровней преобразования адресов виртуальной памяти, которые отличаются процессором и ОС, поэтому точная механика отличается, но основная идея заключается в том, что после mmap ing, вы обходите структуру каталогов и взаимодействуете с базовыми секторами диска таким образом, чтобы игнорировать такие вещи, как имена и пути.

+0

Спасибо, ShadowRanger. В этом случае я был неправ в этой теме, не так ли? http://stackoverflow.com/questions/38850533/how-does-the-page-fault-handler-know-where-to-get-the-4k-bytes/38975619#38975619 Я думал, что нашел ответ. – xiaokaoy

Смежные вопросы