Get the offset of a mapped typed memory block
#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
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The mem_offset() and mem_offset64() functions set the variable pointed to by offset to the offset (or location), within a typed memory object, of the memory block currently mapped at addr.
If the offset is greater than INT_MAX, mem_offset() gives an error of EOVERFLOW. Use mem_offset64() if this happens. |
If you use the offset and contig_len values obtained from calling mem_offset() in a call to mmap() with a file descriptor that refers to the same memory pool as fd (either through the same port or through a different port), the memory region that's mapped must be exactly the same region that was mapped at addr in the address space of the process that called mem_offset().
For best performance results, it is preferable to cache the result of mem_offset(), rather than repeatedly call the function for a given virtual address. |
If you specify fd as NOFD, offset is the offset into /dev/mem of addr (i.e. its physical address). If the memory object specified by fd isn't a typed memory object, or specified as NOFD, the call fails.
If the physical address is not a valid off_t value,
mem_offset() will fail with errno set to
EOVERFLOW. This is typically the case with many ARM systems, and
you should use mem_offset64() to get the physical address.
For the NOFD case, mem_offset():
|
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() is QNX Neutrino; mem_offset64() is Large-file support
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |
mmap(), posix_mem_offset(), posix_mem_offset64()