mem_offset(), mem_offset64()

Получить смещение смаппированного блока типизированной памяти

Прототип:

#include <sys/mman.h>
int mem_offset( const void *addr,
int fd,
size_t length,
off_t *offset,
size_t *contig_len );
int mem_offset64( const void *addr,
int fd,
size_t length,
off64_t *offset,
size_t *contig_len );

Аргументы:

Аргументы:

addr
Виртуальный адрес блока памяти, информацию о котором необходимо получить.
fd
Дескриптор файла, ассоциированного с типизированным объектом памяти. Обычно данный дескриптор используется в функции mmap() для мапирования объекта, адресуемого параметром addr.
length
Длина адресуемого параметром addr блока памяти в байтах.
offset
Указатель на переменную для хранения считанного смещения.
contig_len
Указатель на переменную для хранения либо значения length, либо длины наибольшего непрерывного блока памяти, который в настоящий момент смапирован в текущем процессе по адресу addr. Возвращается наименьшая из этих величин.

Библиотека:

libc

Описание:

Функции mem_offset() и mem_offset64() устанавливают переменной, которая адресуерся указателем offset, значение фактического смещения внутри типизированного блока памяти, имеющего в текущем процессе виртуальный смапированный адрес addr.


Note: Если смещение превышает значение INT_MAX, функция mem_offset() возвращает значение EOVERFLOW. В данном случае необходимо использовать функцию mem_offset64().

Если вы используете значения offset и contig_len, полученные при вызове mem_offset(), для последующего вызова функции mmap() с файловым дескриптором, указывающим на пул памяти fd, смапированный таким образом регион памяти будет в точности соответствовать адресу addr.


Note: Из соображений повышения производительности не рекомендуется повторный вызов mem_offset() для идентичного набора параметров. Предпочтительным считается независимое кэширование считанных характеристик блока типизированной памяти.

Расширение ЗОСРВ «Нейтрино»

Если в качестве fd указана константа NOFD, значение offset будет соответствовать смещению адреса addr относительно начала файла /dev/mem (что является физическим адресом блока памяти). Если объект fd не является типизированным объектом памяти или не соответствует NOFD вызов завершится с ошибкой.


Note: Если физический адрес не является корректным значением off_t, функция mem_offset() завершится с ошибкой и установкой errno в значение EOVERFLOW. Это является типичной ситуации для многих ARM систем. В этом случае для получения физического адреса должна использоваться функция mem_offset64().

При ипользовании NOFD функция mem_offset():

  • Вызывает инициализационное копирование или зануление MAP_PRIVATE или MAP_ANON страниц.
  • Возвращает -1 (EACCES) для MAP_LAZY страниц, память для которых еще не была физически выделена.

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

0
Успешное завершение.
-1
Функция завершилась с ошибкой (устанавлено знаение errno).

Коды ошибок:

EACCES
Процесс не имеет смапированных страниц по адресу addr.
EBADF
Дескриптор файла fd не корректен.
EINVAL
Файловый дескриптор fd не соответствует типизированному объекту, относительно которого смапирован адрес addr.
ENODEV
Файловый дескриптор fd не соответствует поддерживаемому данной функцией типизированному объекту.
ENOSYS
Функция mem_offset() не поддерживается.
EOVERFLOW
Код ошибки специфичен для функции mem_offset() и свидетельствует о слишком большом смещении off_t. В данном случае необходимо использовать функцию mem_offset64().

Примеры:

off64_t offset;
if ( mem_offset64( addr, NOFD, 1, &offset, 0 ) == -1 )
{
/* Error */
} else {
/* offset contains the physical address of the memory mapped at addr. */
}

Классификация:

mem_offset() - ЗОСРВ «Нейтрино»; mem_offset64() - Поддержка больших файлов

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

mmap(), posix_mem_offset(), posix_mem_offset64()




Предыдущий раздел: Описание API системной библиотеки