Где находится путь к файлу после вызова mmap?

char *p = (char*) mmap(...);
....; /* check if p is not -1 */
a = *p;

При выполнении последнего оператора возникает ошибка страницы. Обработчик ошибок в ядре выделит страницу в физической памяти и скопирует 4 КБ байта из файла на эту страницу, а затем изменит запись страницы. Инструкция, читающая *p, будет выполнена снова, на этот раз успешно.

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

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


person xiaokaoy    schedule 04.08.2016    source источник


Ответы (1)


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

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

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

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

person ShadowRanger    schedule 16.09.2016
comment
Спасибо, ShadowRanger. В таком случае, я ошибся в этой теме, не так ли? stackoverflow.com/questions/38850533/ Я думал, что нашел ответ. - person xiaokaoy; 18.09.2016