Внутренние функции mmap () - PullRequest
4 голосов
/ 20 апреля 2009

Широко известно, что наиболее важной функцией mmap () является то, что сопоставление файлов совместно используется многими процессами. Но не менее широко известно, что каждый процесс имеет свое собственное адресное пространство.

Вопрос в том, где действительно хранятся файлы memmapped (точнее, их данные), и как процессы могут получить доступ к этой памяти? Я имею в виду не * (pa + i) и другие высокоуровневые вещи, но я имею в виду внутреннюю часть процесса.

Ответы [ 5 ]

8 голосов
/ 20 апреля 2009

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

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

3 голосов
/ 20 апреля 2009

Это очень зависит от реализации, но одно из возможных воплощений:

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

Когда программа сначала пытается прочитать или записать один из этих адресов, возникает ошибка page . ОС ловит страницу с ошибкой, выясняет, что этот адрес соответствует отображенному в памяти файлу, и считывает соответствующий сектор диска во внутренний буфер ядра. Затем он отображает буфер ядра в адресное пространство процесса и перезапускает инструкцию пользователя, которая вызвала ошибку страницы. Если ошибочная инструкция была прочитана, мы все на сегодня. Если это была запись, данные записываются в память, и страница помечается как грязная. Последующие операции чтения или записи данных на той же странице не требуют чтения / записи на / с диска, поскольку данные находятся в памяти.

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

Использование отображенных в память файлов выгодно для программ, которые читают или записывают секторы диска очень случайным образом. Вы читаете только те сектора диска, которые действительно используются, а не весь файл.

0 голосов
/ 27 октября 2015

Любые данные будут в той или иной форме памяти или других, в некоторых случаях на жестком диске, во встроенных системах может быть некоторая флэш-память или даже оперативная память (initramfs), за исключением последней, данные в памяти часто кэшируются в RAM, RAM логически разделена на страницы, и ядро ​​поддерживает список дескрипторов, которые однозначно идентифицируют страницу.

Таким образом, в лучшем случае доступ к данным будет иметь доступ к физическим страницам. Процесс получает свое собственное адресное пространство процесса, которое состоит из множества vm_are_struct, которое идентифицирует сопоставленный раздел в адресном пространстве. При вызове mmap может быть создан новый vm_area_struct или может быть объединен с существующим, если адреса соседние.

Новый виртуальный адрес возвращается при вызове mmap. Также создаются новые таблицы страниц, которые состоят из сопоставления вновь созданных виртуальных адресов с физическим адресом, где находятся реальные данные. отображение может быть сделано на файл, или анонимно, как malloc. Структура адресного пространства процесса mm_struct использует указатель pgd_t (глобальный каталог Page) для доступа к физической странице и доступа к данным.

0 голосов
/ 20 апреля 2009

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

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

0 голосов
/ 20 апреля 2009

Я не совсем уверен, что вы спрашиваете, но mmap () выделяет часть виртуальной памяти для хранения заданного объема данных (обычно. Иногда это может быть заархивировано).

Процесс - это объект ОС, и он получает доступ к отображенным областям памяти через метод, запрещенный ОС: вызов mmap ().

...