midaslog mmap что это

Midaslog mmap что это

ОПИСАНИЕ

Аргумент prot описывает желаемый режим защиты памяти (он не должен конфликтовать с режимом открытия файла). Оно является либо PROT_NONE либо побитовым ИЛИ одного или нескольких флагов PROT_*. PROT_EXEC (данные в страницах могут исполняться); PROT_READ (данные можно читать); PROT_WRITE (в эту область можно записывать информацию); PROT_NONE (доступ к этой области памяти запрещен).

Вы должны задать либо MAP_SHARED, либо MAP_PRIVATE.

Некоторые системы документируют дополнительные флаги MAP_AUTOGROW, MAP_AUTORESRV, MAP_COPY и MAP_LOCAL.

fd должно быть корректным описателем файла, если только не установлено MAP_ANONYMOUS, так как в этом случае аргумент игнорируется.

offset должен быть пропорционален размеру страницы, получаемому при помощи функции getpagesize (2).

Memory mapped by mmap is preserved across fork (2), with the same attributes.

A file is mapped in multiples of the page size. For a file that is not a multiple of the page size, the remaining memory is zeroed when mapped, and writes to that region are not written out to the file. The effect of changing the size of the underlying file of a mapping on the pages that correspond to added or removed regions of the file is unspecified. Системный вызов munmap удаляет все отражения из заданной области памяти, после чего все ссылки на данную область будут вызывать ошибку «неправильное обращение к памяти» (invalid memory reference). Отражение удаляется автоматически при завершении процесса. С другой стороны, закрытие файла не приведет к снятию отражения.

Адрес start должно быть кратен размеру страницы. Все страницы, содержащие часть указанного диапазона, не отображены, и последующие ссылки на эти страницы будут генерировать SIGSEGV. Это не будет являться ошибкой, если указанный диапазон не содержит отображенных страниц. Для отображений ‘файл-бэкэнд’ поле st_atime отображаемого файла может быть обновлено в любой момент между mmap() и соответствующим снятием отображения; первое обращение к отображенной странице обновит поле, если оно до этого уже не было обновлено.

Поля st_ctime и st_mtime файла, отображенного по PROT_WRITE и MAP_SHARED, будут обновлены после записи в отображенний диапазон, и до вызова последующего msync() с флагом MS_SYNC или MS_ASYNC, если такой случится.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ


ЗАМЕЧАНИЯ


НАЙДЕННЫЕ ОШИБКИ

Использование отражаемой области памяти может привести к следующим сигналам: SIGSEGV (попытка записи в область памяти, заданную mmap как область для чтения); SIGBUS (попытка доступа к части буфера, которая не является файлом; например, она может находиться за пределами файла. Подобной является ситуация, когда другой процесс уменьшает длину файла).

Источник

Файлы, отображаемые в память

#include
void *mmap( void *addr, size_t len, int prot, int flag, int filedes, off_t off);

Она возвращает адрес начала участка отображаемой памяти или MAP_FAILED в случае неудачи.
Первый аргумент — желаемый адрес начала участка отбраженной памяти. Не знаю, когда это может пригодится. Передаём 0 — тогда ядро само выберет этот адрес.
len — количество байт, которое нужно отобразить в память.
prot — число, определяющее степень защищённости отображенного участка памяти(только чтение, только запись, исполнение, область недоступна). Обычные значения — PROT_READ, PROT_WRITE (можно кобминировать через ИЛИ). Не буду на этом останавливаться — подробнее читайте в манах. Отмечу лишь, что защищённость памяти не установится ниже, чем права, с которыми открыт файл.
flag — описывает атрибуты области. Обычное значение — MAP_SHARED. По поводу остальных — курите маны. Но замечу, что использование MAP_FIXED понижает переносимость приложения, т.к. его подержка является необязательной в POSIX-системах.
filedes — как вы уже догались — дескриптор файла, который нужно отобразить.
off — смещение отображенного участка от начала файла.

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

Ниже приведён пример(честно стырен из замечательной книжки «Unix. Профессиональное программирование») программы, которая копирует файл с использованием MMF.

Источник

Русские Блоги

Управление памятью: отображение памяти mmap

Где mmap в Linux?

Что такое ММАП?

Есть много способов работы с оборудованием, например ioctl, ioremap.

Что такое отображение памяти?

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

Что такое виртуальное адресное пространство?

Каждый процесс имеет виртуальное адресное пространство 4G, из которых пространство пользователя 3G, пространство ядра 1G (linux), каждый процесс разделяет пространство ядра, независимое пространство пользователя, это ярко выражено на следующем рисунке.

Драйвер работает в пространстве ядра, поэтому драйвер предназначен для всех процессов.

Есть два способа переключиться из пользовательского пространства в пространство ядра:

(1) Системный вызов, т.е. мягкое прерывание

(2) Аппаратное прерывание

Что находится в виртуальном адресном пространстве?

Зная, что такое виртуальное адресное пространство, что находится в виртуальном адресном пространстве? Посмотрите на картинку ниже

Виртуальное пространство, вероятно, содержит указанные выше данные. Отображение памяти, вероятно, сопоставляет адрес устройства с красным сегментом на приведенном выше рисунке. В настоящее время он называется «сегментом сопоставления памяти». Что касается того, на какой адрес отображается, он выделяется операционной системой. Операционная система делит пространство процесса на три части:

Читайте также:  какой пастой чистить зубы после отбеливания

(1) Нераспределенный, то есть неиспользуемый адрес процесса

(2) Кэширование, страницы кэшируются в оперативной памяти

(3) Не кэшируется, не кэшируется в оперативной памяти

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

Дескриптор памяти

Конкретную структуру см. На рисунке ниже.

Реализация отображения памяти

В качестве примера возьмем драйвер символьного устройства. Обычно символьное устройство работает следующим образом.

Ниже приведен исходный код mmap_driver.c.

Ниже приведен тестовый код test_mmap.c

Ниже находится make-файл

Следующая команда демонстрирует процесс компиляции, установки и тестирования драйвера (Примечание: другим пользователям необходимо изменить разрешения после mknod)

# make // Компилируем драйвер

# insmod mmap_driver.ko // Устанавливаем драйвер

# mknod / dev / mmap_driver c 999 0 // Создать файл устройства

В отношении этого процесса задействованы некоторые термины.

(1) Файл устройства: в Linux оборудование виртуализировано как файл устройства, и к файлу устройства применимы различные операции с обычными файлами.

(2) Индексный узел: Linux использует индексный узел для записи информации о файле (такой как длина файла, время создания и модификации). Он хранится на диске. После чтения в память это структура inode. Файловая система поддерживает массив индексных узлов. Каждый элемент имеет однозначное соответствие с файлами или каталогами.

(3) Основной номер устройства: например, 999 выше, указывает тип устройства, например, является ли оно ЖК-дисплеем или USB и т. Д.

(4) Дополнительный номер устройства: например, 0 выше, означает разные устройства на этом типе устройства.

(5) Три структуры файлов (обычные файлы или файлы оборудования)

①Файловые операции: struct file_operations

② Файловый объект: struct file

③ Узел индекса файла: struct inode

Что касается реализации отображения памяти в драйвере, давайте сначала разберемся в процессе открытия и закрытия

(1) Процесс открытия драйвера устройства

①Приложение вызывает open («/ dev / mmap_driver», O_RDWR);

②Open найдет индексный узел (inode) устройства через VFS. Когда mknod, структура file_operations драйвера будет заполнена в индексном узле в соответствии с номером устройства (примерно mknod / dev / mmap_driver c 999 0, эта инструкция создает файл устройства. При установке драйвера (insmod) она запускает программу инициализации драйвера (module_init), а в программе инициализации он будет зарегистрирован (Cdev_add), если основной номер устройства 999 mknod не существует в системе, то есть он отличается от зарегистрированного основного номера устройства, указанная выше команда не выполнится и файл устройства не может быть создан)

③ Затем в соответствии с указателем open в file_operations в индексном узле файла устройства вызывается метод open драйвера.

④ Создание структуры файлового объекта files_struct, и система поддерживает связанный список files_struct, представляющий все открытые файлы в системе.

⑤ Вернуть файловый дескриптор fd и добавить fd в таблицу файловых дескрипторов процесса.

(2) Процесс закрытия драйвера устройства

Приложение вызывает close (fd), и, наконец, может быть вызвано закрытие драйвера.Почему можно найти функцию закрытия драйвера на основе простого типа int fd? Это тесно связано с тремя упомянутыми выше структурами (struct file_operations, struct file, struct inode), если fd = 3

(3) Процесс mmap драйвера устройства

Аналогично, известное как open и close, приложение, вызывающее mmap, в конечном итоге вызовет метод mmap в драйвере.

① функция mmap в приложении test.mmap.c

void* mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

addr: начальный адрес виртуального адреса после сопоставления, обычно NULL, автоматически назначается ядром

длина: размер области отображения

prot: права доступа к странице (PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE)

flags: справочная сетевая информация

fd: дескриптор файла

смещение: начальное смещение отображения файла

② функция mmap в mmap_driver.c драйвера

① Исходя из вышесказанного, различные модули ядра сложны и пересекаются друг с другом.

②Простой небольшой модуль драйвера включает управление процессами (адресное пространство процесса), управление памятью (таблица страниц и отображение кадров страниц), виртуальную файловую систему ( struct file 、 struct inode )

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

Источник

Русские Блоги

Linux memory mapping-mmap

Системный вызов mmap

1. Карта памяти

Так называемое отображение памяти предназначено для отображения физической памяти в адресное пространство процесса, эти приложения могут напрямую использовать адресное пространство ввода и вывода, тем самым повышая эффективность чтения и записи. Linux предоставляет функцию mmap (), используемую для отображения физической памяти. В драйвере приложение принимает файл устройства в качестве объекта, вызывает функцию mmap (), ядро ​​готовится к отображению памяти, генерирует структуру vm_area_struct, а затем вызывает функцию mmap, определенную в драйвере устройства.

Системный вызов 2.mmap

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

После использования mmap для сопоставления файла с процессом вы можете напрямую манипулировать этим виртуальным адресом для чтения и записи файлов и т. Д., Не вызывая read, write и другие системные вызовы. Однако следует отметить, что при прямой записи в этот сегмент памяти не будет записано ничего, превышающего текущий размер файла.

Читайте также:  какой знак зодиака скорпион ненавидит

Одним из очевидных преимуществ использования совместной памяти является высокая эффективность, Потому что процесс может напрямую читать и записывать память без какой-либо копии данных. Для методов связи, таких как каналы и очереди сообщений, требуется четыре копии данных в ядре и пространстве пользователя, в то время как общая память копирует данные только дважды: один раз из входного файла в область общей памяти и один раз из области общей памяти в Выходной файл. На самом деле, при совместном использовании памяти между процессами не всегда необходимо удалять карту после чтения и записи небольшого объема данных.При появлении нового обмена данными область общей памяти восстанавливается. Вместо этого общая область сохраняется до тех пор, пока связь не будет завершена, поэтому содержимое данных сохраняется в общей памяти, а файл не записывается обратно. Содержимое разделяемой памяти часто записывается обратно в файл, только когда отображение не сопоставлено. Следовательно, эффективность способа связи с использованием разделяемой памяти очень высока.

На основе сопоставления файлов в любой момент во время выполнения mmap и munmap st_atime сопоставленного файла может обновляться. Если поле st_atime не было обновлено при вышеупомянутых обстоятельствах, значение этого поля будет обновлено, когда будет проиндексирована первая страница области отображения. Отображение файла, установленное с флагами PROT_WRITE и MAP_SHARED, после того, как st_ctime и st_mtime записываются в область отображения, но будет обновлено до вызова msync () MS_SYNC и MS_ASYNC.

Применение:

void *mmap(void *start, size_t length, int prot, int flags,

int fd, off_t offset);

int munmap(void *start, size_t length);

Инструкции по возврату:

EACCES: ошибка доступа

EAGAIN: файл был заблокирован или слишком много памяти было заблокировано

EBADF: fd не является допустимым дескриптором файла

EINVAL: один или несколько параметров недействительны

ENFILE: система достигла предела для открытия файлов

ENODEV: файловая система, в которой находится указанный файл, не поддерживает отображение памяти

ENOMEM: недостаточно памяти или процесс превысил максимальное количество карт памяти

EPERM: недостаточная мощность, работа не разрешена

ETXTBSY: откройте файл в письменном режиме и укажите флаг MAP_DENYWRITE

SIGSEGV: попробуйте написать в область только для чтения

SIGBUS: попробуйте получить доступ к области памяти, которая не принадлежит процессу

параметр:

start: начальный адрес области отображения.

длина: длина области отображения.

prot: желаемый флаг защиты памяти, Не должен конфликтовать с режимом открытия файла. Является одним из следующих значений, которые могут быть разумно объединены с помощью операции или

PROT_EXEC // содержимое страницы может быть выполнено

PROT_READ // Содержание страницы можно прочитать

PROT_WRITE // страницы могут быть написаны

PROT_NONE // страницы не доступны

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

MAP_SHARED // Совместно использовать пространство отображения со всеми другими процессами, которые отображают этот объект. Запись в общую область эквивалентна выводу в файл. Пока не будут вызваны msync () или munmap (), файл фактически не будет обновляться.

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

MAP_DENYWRITE // Этот флаг игнорируется.

MAP_EXECUTABLE // То же, что и выше

MAP_NORESERVE // Не резервируйте пространство подкачки для этого отображения. Когда пространство подкачки зарезервировано, изменения в области отображения могут быть гарантированы. Когда пространство подкачки не зарезервировано и памяти недостаточно, изменение области сопоставления вызовет сигнал нарушения сегмента.

MAP_LOCKED // Блокировка страниц в отображаемой области, что предотвращает выгрузку страниц из памяти.

MAP_GROWSDOWN // используется для стека, чтобы сообщить системе VM ядра, что область отображения может быть расширена вниз.

MAP_ANONYMOUS // Анонимное отображение, область отображения не связана ни с одним файлом.

Другое имя для MAP_ANON // MAP_ANONYMOUS больше не используется.

MAP_FILE // Флаг совместимости, игнорируется.

MAP_32BIT // Помещаем область сопоставления в нижние 2 ГБ адресного пространства процесса, и она будет игнорироваться, если указано MAP_FIXED. В настоящее время этот флаг поддерживается только на платформах x86-64.

MAP_POPULATE // Подготовить таблицы страниц для сопоставления файлов с помощью предварительного чтения. Последующий доступ к отображаемой области не будет заблокирован нарушениями страницы.

MAP_NONBLOCK // имеет смысл только при использовании с MAP_POPULATE. Предварительное чтение не выполняется, только запись таблицы страниц создается для страниц, уже находящихся в памяти.

смещение: начальная точка содержимого сопоставленного объекта.

3. munmap Системный вызов

4. msync Системный вызов

Два Два метода системного вызова mmap () для разделяемой памяти

(1) Используйте отображение памяти, предоставляемое обычным файлом: применимо к любому процессу, в данный момент вам нужно открыть или создать файл, а затем вызвать mmap (); типичный код вызова выглядит следующим образом:

Есть много характеристик и моментов, которые следует отметить в связи с методом совместной памяти через mmap ().

Читайте также:  какой нивелир выбрать для установки маяков

три Принцип отображения памяти mmap

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

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

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

Рисунок 3.1 Разделение виртуального пространства процесса

В ядре каждая область представлена ​​структурой struct_vm_area_struct, описывающей непрерывное пространство виртуальной памяти с одинаковыми атрибутами доступа. Размер пространства виртуальной памяти кратен целой странице физической памяти. Может сделать использование cat /proc/

Ниже приведено определение структуры struct vm_area_struct:

Как правило, пространство виртуальной памяти, используемое процессом, не является непрерывным, и атрибуты доступа каждой части пространства виртуальной памяти также могут отличаться. Таким образом, пространство виртуальной памяти процесса требует нескольких структур vm_area_struct для описания. Когда количество структур vm_area_struct мало, каждая vm_area_struct сортируется в порядке возрастания, а данные организуются в виде односвязного списка (указывающего на следующую структуру vm_area_struct через указатель vm_next). Однако, когда данных структуры vm_area_struct больше, организация связанного списка все еще принимается, что неизбежно влияет на скорость его поиска. В ответ на эту проблему vm_area_struct также добавила три члена: vm_avl_hight (высота дерева), vm_avl_left (левый дочерний узел) и vm_avl_right (правый дочерний узел), чтобы реализовать дерево AVL для повышения скорости поиска vm_area_struct.

Рисунок 3.2 Принципиальная схема процесса виртуального адреса

Поэтому работа, выполняемая системным вызовом mmap, заключается в подготовке такого пространства виртуальной памяти, создании структуры vm_area_struct и передаче ее конкретному драйверу устройства.

2 Установить соответствие между виртуальным адресным пространством и физическим адресом файла или устройства (завершение драйвера устройства)

Вторым шагом в установлении сопоставления файлов является установление сопоставления между виртуальными адресами и конкретными физическими адресами, что достигается путем изменения таблицы страниц процесса. Метод mmap является членом структуры file_opeartions:

int (*mmap)(struct file *,struct vm_area_struct *);

У Linux есть 2 способа создать таблицу страниц:

(1) Используйте remap_pfn_range, чтобы создать все таблицы страниц одновременно.

int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);

Успех возвращает 0, сбой возвращает отрицательное значение ошибки
Описание параметра:

Пользовательский процесс vma создает область vma

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

Номер фрейма страницы pfn соответствует физическому адресу, которому должен быть сопоставлен виртуальный адрес. Этот номер фрейма страницы является просто физическим адресом, смещенным вправо на PAGE_SHIFT. В большинстве случаев структура VMA члена VMA содержит именно то значение, которое вам нужно. Эта функция влияет на физический адрес. Адрес варьируется от (pfn

Размер Размер области, в байтах.

prot «Защита», требуемая новым VMA. Драйвер может (и должен) использовать значение, найденное в vma-> vm_page_prot.

(2) Используйте метод VMA nopage, чтобы создать запись таблицы страниц за раз.

struct page *(*nopage)(struct vm_area_struct *vma, unsigned long address, int *type);

В случае успеха он возвращает действительную страницу сопоставления, в случае ошибки он возвращает NULL.

адрес представляет виртуальный адрес пространства пользователя, переданный из пространства пользователя.

Вернуть действительную страницу сопоставления.

(3) Ограничения на использование:

remap_pfn_range не может отобразить обычную память, только получить доступ к зарезервированным страницам и физическим адресам поверх физической памяти. Поскольку зарезервированные страницы и физические адреса в верхней части физической памяти не управляются подмодулями системы управления памятью. 640 КБ и 1 МБ зарезервированы для возможного отображения страниц, а память устройства ввода-вывода также может быть отображена. Если вы хотите отобразить память, запрошенную kmalloc (), в пространство пользователя, вы можете установить соответствующую память как зарезервированную mem_map_reserve ().

(4) Разница между remap_pfn_range и nopage

3 Операция при фактическом доступе к вновь отображенной странице (завершается прерыванием сбоя страницы)

(4) В случае отображения общей памяти обработчик исключений сбоя страницы сначала ищет целевую страницу (физическую страницу, которая соответствует address_space и смещению) в кэш-памяти подкачки, если он найден, он возвращает адрес напрямую, если он не найден, он судит страницу Если он находится в области подкачки, если он есть, выполните операцию подкачки, если два вышеуказанных условия не выполнены, обработчик выделит новую физическую страницу и вставит ее в кеш страниц. Процесс в конечном итоге обновит таблицу страниц процесса.

Четыре резюме

3. Процесс пользовательского пространства вызывает функцию mmap, сначала выполняет необходимую обработку, генерирует структуру vma, а затем вызывает функцию remap_pfn_range для создания таблицы страниц. Функция mmap в пространстве пользователя возвращает первый адрес, сопоставленный с адресным пространством процесса. Поэтому функция mmap отличается от функции remap_pfn_range, которая генерирует только mmap, а таблица страниц создается функцией remap_pfn_range.

Источник

Сказочный портал