![]() |
![]() |
![]() |
![]() |
![]() |
This version of this document is no longer maintained. For the latest documentation, see http://www.qnx.com/developers/docs. |
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 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().
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 E2BIG. This is typically the case with many ARM systems, and you should use mem_offset64() to get the physical address. |
#include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/mman.h> paddr_t mphys(void *addr) { off64_t offset; if(mem_offset64(addr, NOFD, 1, &offset, 0) == -1) { return -1; } return offset; }
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()
![]() |
![]() |
![]() |
![]() |