Мапировать физическую память устройства в адресное пространство процесса
#include <sys/mman.h>void * mmap_device_memory( void *addr,size_t len,int prot,int flags,uint64_t physical );
NULL
или указатель на виртуальный адрес, по которому должна быть смапирована память в вызывающем процессе.0
.<sys/mman.h>
: ![]() | Следует изучить руководство по архитектуре используемого процессора, так как может потребоваться добавить специальные инструкции. Например, если будет указан PROT_NOCACHE на устройстве с архитектурой PPC, может потребоваться использовать специальную инструкции eieio (принудительное выполнение операций ввода-вывода по порядку), чтобы гарантировать, что записи производятся в требуемом порядке. Макрос eieio() определён в <ppc/inout.h> . |
![]() | Используйте флаг MAP_FIXED с осторожностью. Не все модели памяти поддерживают его. В общем случае следует исходить из того, что MAP_FIXED можно использовать только с адресами (и размерами), возвращаемыми mmap() без MAP_FIXED . |
MAP_FIXED
, сначала размапируется системой, используя ту же область памяти. Подробности см. в munmap(). libc
Функция mmap_device_memory() мапирует len
байт диапазона адресов физической памяти устройства в адресное пространство вызывающего процесса по адресу, возвращаемому mmap_device_memory().
Следует использовать эту функцию вместо mmap() с флагом MAP_PHYS
.
Как правило, нет необходимости использовать параметр addr; вместо этого можно передать NULL
. Если для addr установлено значение, отличное от NULL
, мапирование объекта зависит от того, установлен ли флаг MAP_FIXED
в параметре flags:
MAP_FIXED
установлен MAP_FIXED
не установлен Адрес смапированного объекта.
Если возникла ошибка, функция возвращает MAP_FAILED
, код ошибки записывается в errno.
0
. MAP_FIXED
, но параметры addr, len и physical также недействительны для запрошенного объекта. /* Смапировать физическую память; 0xb8000 - видеопамять текстового режима VGA */ptr = mmap_device_memory( 0, len, PROT_READ | PROT_WRITE | PROT_NOCACHE, 0, 0xb8000 );if ( ptr == MAP_FAILED ){perror( "mmap_device_memory for physical address 0xb8000 failed" );exit( EXIT_FAILURE );}
ЗОСРВ «Нейтрино»
mmap(), mmap_device_io(), munmap_device_memory()
Предыдущий раздел: Описание API системной библиотеки