mmap_device_memory()

Мапировать физическую память устройства в адресное пространство процесса

Прототип:

#include <sys/mman.h>
void * mmap_device_memory( void *addr,
size_t len,
int prot,
int flags,
uint64_t physical );

Аргументы:

addr
NULL или указатель на виртуальный адрес, по которому должна быть смапирована память в вызывающем процессе.
len
Количество байт, которое необходимо cмапировать в адресное пространство вызывающего процесса. Не может быть равно 0.
prot
Возможности доступа, которые необходимо использовать для мапируемой области памяти. Может быть использована комбинация следующих битов, определённых в <sys/mman.h>:
PROT_EXEC
область памяти помечается в качестве исполняемой.
PROT_NOCACHE
отключить кэширование области памяти (например, для доступа к двухпортовой памяти).

Note: Следует изучить руководство по архитектуре используемого процессора, так как может потребоваться добавить специальные инструкции. Например, если будет указан PROT_NOCACHE на устройстве с архитектурой PPC, может потребоваться использовать специальную инструкции eieio (принудительное выполнение операций ввода-вывода по порядку), чтобы гарантировать, что записи производятся в требуемом порядке. Макрос eieio() определён в <ppc/inout.h>.

PROT_NONE
доступ к области памяти невозможен.
PROT_READ
для области памяти разрешено чтение.
PROT_WRITE
для области памяти разрешена запись.
flags
Указывает дополнительную информацию для обработки мапируемой области. Можно использовать следующий флаг:
MAP_FIXED
объект мапируется по адресу, заданному параметром addr. Если эта область уже смапирована, вызов заменяет существующее мапирование для этой области.

Note: Используйте флаг MAP_FIXED с осторожностью. Не все модели памяти поддерживают его. В общем случае следует исходить из того, что MAP_FIXED можно использовать только с адресами (и размерами), возвращаемыми mmap() без MAP_FIXED.

Область памяти, мапируемая с помощью MAP_FIXED, сначала размапируется системой, используя ту же область памяти. Подробности см. в munmap().
Эта функция использует флаги MAP_SHARED и MAP_PHYS (описание этих флагов см. в mmap()).
physical
Физический адрес памяти для мапирования в адресное пространство вызывающего процесса.

Библиотека:

libc

Описание:

Функция mmap_device_memory() мапирует len байт диапазона адресов физической памяти устройства в адресное пространство вызывающего процесса по адресу, возвращаемому mmap_device_memory().

Следует использовать эту функцию вместо mmap() с флагом MAP_PHYS.

Как правило, нет необходимости использовать параметр addr; вместо этого можно передать NULL. Если для addr установлено значение, отличное от NULL, мапирование объекта зависит от того, установлен ли флаг MAP_FIXED в параметре flags:

флаг MAP_FIXED установлен
Объект мапируется по адресу, заданному параметром addr, или функция завершается ошибкой.
флаг MAP_FIXED не установлен
Значение параметра addr воспринимается как подсказка относительно того, куда мапировать объект в адресном пространстве вызывающего процесса. Смапированная область не будет накладываться на текущие смапированные области.

Возвращаемое значение:

Адрес смапированного объекта.

Если возникла ошибка, функция возвращает MAP_FAILED, код ошибки записывается в errno.

Коды ошибок:

EINVAL
Недопустимый тип флагов, заданных параметром flags, или значение параметра len равно 0.
ENOMEM
Запрошенный диапазон адресов выходит за пределы разрешенного диапазона адресов процесса или для выполнения запроса недостаточно памяти.
ENXIO
Диапазон адресов, начинающийся с адреса, заданного параметром physical и размером len байт, недействителен для запрошенного объекта, либо был указан флаг 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 системной библиотеки