Получить смещение смапированного блока типизированной памяти
#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 );
libc
Функции mem_offset() и mem_offset64() устанавливают переменной, которая адресуерся указателем offset, значение фактического смещения внутри типизированного блока памяти, имеющего в текущем процессе виртуальный смапированный адрес addr.
Если смещение превышает значение INT_MAX , функция mem_offset() возвращает значение EOVERFLOW . В данном случае необходимо использовать функцию mem_offset64(). |
Если вы используете значения offset и contig_len, полученные при вызове mem_offset(), для последующего вызова функции mmap() с файловым дескриптором, указывающим на пул памяти fd, смапированный таким образом регион памяти будет в точности соответствовать адресу addr.
Из соображений повышения производительности не рекомендуется повторный вызов mem_offset() для идентичного набора параметров. Предпочтительным считается независимое кэширование считанных характеристик блока типизированной памяти. |
Расширение ЗОСРВ «Нейтрино»
Если в качестве fd указана константа NOFD
, значение offset будет соответствовать смещению адреса addr относительно начала файла /dev/mem
(что является физическим адресом блока памяти). Если объект fd не является типизированным объектом памяти или не соответствует NOFD
вызов завершится с ошибкой.
Если физический адрес не является корректным значением off_t , функция mem_offset() завершится с ошибкой и установкой errno в значение EOVERFLOW . Это является типичной ситуации для многих ARM систем. В этом случае для получения физического адреса должна использоваться функция mem_offset64().
При ипользовании
|
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 системной библиотеки