Mmap linux что это
Mmap linux что это
ОПИСАНИЕ
Аргумент 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 (попытка доступа к части буфера, которая не является файлом; например, она может находиться за пределами файла. Подобной является ситуация, когда другой процесс уменьшает длину файла).
пФПВТБЦБЕНБС РБНСФШ
пФПВТБЦБЕНБС РБНСФШ РПЪЧПМСЕФ ТБЪМЙЮОЩН РТПГЕУУБН ПВЭБФШУС ЮЕТЕЪ ПВЭЕДПУФХРОЩК ЖБКМ. пФПВТБЦБЕНБС РБНСФШ НПЦЕФ ЙУРПМШЪПЧБФШУС ДМС ЧЪБЙНПДЕКУФЧЙС РТПГЕУУПЧ ЙМЙ ЛБЛ РТПУФПК УРПУПВ ДМС ПВТБЭЕОЙС Л УПДЕТЦЙНПНХ ЖБКМБ. пФПВТБЦБЕНБС РБНСФШ ЖПТНЙТХЕФ БУУПГЙБГЙА НЕЦДХ ЖБКМПН Й РБНСФША РТПГЕУУБ. Linux ТБЪВЙЧБЕФ ЖБКМ ОБ ЛХУЛЙ ТБЪНЕТПН УФТБОЙГЩ Й ЪБФЕН ЛПРЙТХЕФ ЙИ Ч УФТБОЙГЩ ЧЙТФХБМШОПК РБНСФЙ ФБЛ, ЮФПВЩ ПОЙ НПЗМЙ ВЩФШ РТЕДУФБЧМЕОЩ Ч БДТЕУОПН РТПУФТБОУФЧЕ РТПГЕУУБ. фБЛЙН ПВТБЪПН, РТПГЕУУ НПЦЕФ ЮЙФБФШ УПДЕТЦБОЙЕ ЖБКМБ ПВЩЮОЩН ДПУФХРПН Л РБНСФЙ. пО НПЦЕФ ФБЛЦЕ ЙЪНЕОЙФШ УПДЕТЦЙНПЕ ЖБКМБ, ЪБРЙУЩЧБС Ч РБНСФШ. юФП РПЪЧПМСЕФ ВЩУФТП ЧЪБЙНПДЕКУФЧПЧБФШ У ЖБКМПН.
уХЭЕУФЧХАФ ЙОЩЕ НЕФПДЩ ЙУРПМШЪПЧБОЙС ПФПВТБЦБЕНПК РБНСФЙ. оЕЛПФПТЩЕ ЙЪ ОЙИ ПРЙУБОЩ Ч ТБЪДЕМЕ «дТХЗЙЕ НЕФПДЩ ЙУРПМШЪПЧБОЙС ДМС mmap.»
пФПВТБЦЕОЙЕ ПВЩЮОПЗП ЖБКМБ
рТЙНЕТ РТПЗТБННЩ
дБЧБКФЕ РПУНПФТЙН ОБ ДЧЕ РТПЗТБННЩ ДЕНПОУФТЙТХАЭЙЕ ЙУРПМШЪПЧБОЙЕ ПВМБУФЙ ПФПВТБЦБЕНПК РБНСФЙ, У ГЕМША ЮФЕОЙС Й ЪБРЙУЙ Ч ЖБКМБН. рЕТЧБС РТПЗТБННБ, МЙУФЙОЗ 5.5, ЗЕОЕТЙТХЕФ УМХЮБКОПЕ ЮЙУМП Й РЙЫЕФ ЕЗП Ч ЖБКМ. чФПТБС РТПЗТБННБ, МЙУФЙОЗ 5.6, ЮЙФБЕФ ЮЙУМП, РЕЮБФБЕФ ЕЗП, Й ХДЧБЙЧБЕФ ЕЗП Ч ЖБКМЕ. пВЕ РТПЗТБННЩ УЮЙФЩЧБАФ ЙНЕОБ ПФПВТБЦБЕНЩИ ЖБКМПЧ ЙЪ ЛПНБОДОПК УФТПЛЙ.
Listing 5.5 (mmap-write.c) ъБРЙУЩЧБЕФ УМХЮБКОПЕ ЮЙУМП Ч ПФПВТБЦБЕНХА РБНСФШ
рТПЗТБННБ ПФПВТБЦБЕФ ЖБКМ Й ЪБФЕН ЪБЛТЩЧБЕФ ДЕУЛТЙРФПТ ЖБКМБ, РПФПНХ ЮФП ПО ВПМШЫЕ ОЕ ОХЦЕО. рТПЗТБННБ РЙЫЕФ УМХЮБКОПЕ ГЕМПЕ ЮЙУМП Ч ПФПВТБЦБЕНХА РБНСФШ, ФБЛЙН ПВТБЪПНЙ Ч ЖБКМ, Й ПУЧПВПЦДБЕФ ПФПВТБЦБЕНХА РБНСФШ. чЩЪПЧ munmap ОЕОХЦЕО, РПФПНХ ЮФП Linux БЧФПНБФЙЮЕУЛЙ ПУЧПВПДЙМ ВЩ ПФПВТБЦБЕНХА РБНСФШ Й ЖБКМ, ЛПЗДБ РТПЗТБННБ ЪБЧЕТЫЙФУС.
Listing 5.6 (mmap-read.c) юЙФБЕФ ЮЙУМП ЙЪ ЖБКМБ ПФПВТБЦЕООПЗП Ч РБНСФЙ Й ХДЧБЙЧБЕФ ЮЙУМП.
уПЧНЕУФОЩК ДПУФХР Л ЖБКМХ
тБЪМЙЮОЩЕ РТПГЕУУЩ НПЗХФ ЧЪБЙНПЕДКУФЧПЧБФШ ЙУРПМШЪХС ПВМБУФЙ ПФПВТБЦБЕНПК РБНСФША, УЧСЪБООЩЕ У ПДОЙН Й ФЕН ЦЕ ЖБКМПН. хЛБЦЙФЕ ЖМБЦПЛ MAP_SHARED ДМС ФПЗП, ЮФПВЩ МАВЩЕ ПРЕТБГЙЙ ЪБРЙУЙ Ч ПВМБУФШ РБНСФЙ ОЕНЕДМЕООП РЕТЕДБАФУС ЖБКМХ Й ЧЙДЙНЩН ДТХЗЙН РТПГЕУУБН. еУМЙ чЩ ОЕ ПРТЕДЕМСЕФЕ ЬФПФ ЖМБЦПЛ, Linux НПЦЕФ ВХЖЕТЙЪПЧБФШ ПРЕТБГЙЙ ЪБРЙУЙ РЕТЕД РЕТЕДБЮЕК ЙИ Л ЖБКМХ.
лБЛ Й У УПЧНЕУФОП ЙУРПМШЪХЕНПК РБНСФША, РПМШЪПЧБФЕМЙ ПВМБУФЕК ПФПВТБЦЕООПК РБНСФЙ ДПМЦОЩ УМЕДПЧБФШ РТПФПЛПМХ, ЮФПВЩ ЙЪВЕЦБФШ ХУМПЧЙК ЗПОЛЙ. оБРТЙНЕТ, УЕНБЖПТ НПЦЕФ ЙУРПМШЪПЧБФШУС, ЮФПВЩ РТЕРСФУФЧПЧБФШ ДПУФХРХВПМЕЕ ПДОПЗП РТПГЕУУБ Л ПФПВТБЦЕООПК РБНСФЙ.
юБУФОЩЕ ПФПВТБЦЕОЙС
хЛБЪЩЧБС ЖМБЗ MAP_PRIVATE РТЙ ЧЩЪПЧЕ mmap УПЪДБЕФУС ПВМБУФШ ЛПРЙТПЧБОЙС РТЙ ЪБРЙУЙ. мАВБС ПРЕТБГЙС ЪБРЙУЙ ПФТБЦБЕФУС ФПМШЛП Ч РБНСФЙ ЬФПЗП РТПГЕУУБ; ДТХЗЙЕ РТПГЕУУЩ, ЛПФПТЩЕ ПФПВТБЦБАФ ФПФ ЦЕ УБНЩК ЖБКМ, ОЕ ВХДХФ ЧЙДЕФШ ЙЪНЕОЕОЙС. чНЕУФП ФПЗП, ЮФПВЩ РЙУБФШ ОЕРПУТЕДУФЧЕООП УФТБОЙГЕ, ТБЪДЕМЕООПК ЧУЕНЙ РТПГЕУУБНЙ, РТПГЕУУ РЙЫЕФ ЮБУФОПК ЛПРЙЙ ЬФПК УФТБОЙГЩ. чУЕ РПУМЕДХАЭЙЕ ПРЕТБГЙЙ ЮЙФЕОЙС Й ЪБРЙУЙ РТПГЕУУПН ЙУРПМШЪХАФ ЬФХ ЦЕ УФТБОЙГХ.
дТХЗЙЕ РТЙНЕОЕОЙС mmap
Mmap linux что это
If addr is NULL, then the kernel chooses the address at which to create the mapping; this is the most portable method of creating a new mapping. If addr is not NULL, then the kernel takes it as a hint about where to place the mapping; on Linux, the mapping will be created at the next higher page boundary. The address of the new mapping is returned as the result of the call.
The prot argument describes the desired memory protection of the mapping (and must not conflict with the open mode of the file). It is either PROT_NONE or the bitwise OR of one or more of the following flags: PROT_EXEC Pages may be executed. PROT_READ Pages may be read. PROT_WRITE Pages may be written. PROT_NONE Pages may not be accessed.
The flags argument determines whether updates to the mapping are visible to other processes mapping the same region, and whether updates are carried through to the underlying file. This behavior is determined by including exactly one of the following values in flags : MAP_SHARED Share this mapping. Updates to the mapping are visible to other processes that map this file, and are carried through to the underlying file. The file may not actually be updated until msync (2) or munmap () is called. MAP_PRIVATE Create a private copy-on-write mapping. Updates to the mapping are not visible to other processes mapping the same file, and are not carried through to the underlying file. It is unspecified whether changes made to the file after the mmap () call are visible in the mapped region.
Both of these flags are described in POSIX.1-2001.
Of the above flags, only MAP_FIXED is specified in POSIX.1-2001. However, most systems also support MAP_ANONYMOUS (or its synonym MAP_ANON ). MAP_STACK (since Linux 2.6.27) Allocate the mapping at an address suitable for a process or thread stack. This flag is currently a no-op, but is used in the glibc threading implementation so that if some architectures require special treatment for stack allocations, support can later be transparently implemented for glibc.
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()
Timestamps changes for file-backed mappings
The st_ctime and st_mtime field for a file mapped with PROT_WRITE and MAP_SHARED will be updated after a write to the mapped region, and before a subsequent msync (2) with the MS_SYNC or MS_ASYNC flag, if one occurs.
RETURN VALUE
ERRORS
Use of a mapped region can result in these signals: SIGSEGV Attempted write into a region mapped as read-only. SIGBUS Attempted access to a portion of the buffer that does not correspond to the file (for example, beyond the end of the file, including the case where another process has truncated the file).
CONFORMING TO
AVAILABILITY
NOTES
EXAMPLE
The following program prints part of the file specified in its first command-line argument to standard output. The range of bytes to be printed is specified via offset and length values in the second and third command-line arguments. The program creates a memory mapping of the required pages of the file and then uses write (2) to output the desired bytes.
Файлы, отображаемые в память
#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.
Русские Блоги
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.