Map a device's physical memory into a process's address space
#include <sys/mman.h>
void * mmap_device_memory( void * addr,
size_t len,
int prot,
int flags,
uint64_t physical );
libc
The mmap_device_memory() function maps len bytes of a device's physical memory address into the caller's address space at the location returned by mmap_device_memory().
You should use this function instead of using mmap() with the MAP_PHYS flag.
The arguments are as follows:
| Protection | Description |
|---|---|
| PROT_EXEC | The region can be executed. |
| PROT_NOCACHE | Disable caching of the region (e.g. can be used to access dual-ported memory). |
| Read the architecture guide for your processor -- you may need to add special instructions! For example, if you specify PROT_NOCACHE on a PPC device, you may need to issue special eieio() instructions to ensure that writes occur in a desired order. |
| PROT_NONE | The region can't be accessed. |
| PROT_READ | The region can be read. |
| PROT_WRITE | The region can be written. |
A memory area being mmap()'d with MAP_FIXED will first be munmap()'d by the system using the same memory area. See munmap() for details.
This function already uses MAP_SHARED ORed with MAP_PHYS (see mmap() for a description of these flags).
The address of the mapped-in object, or MAP_FAILED if an error occurs (errno is set).
/* map in the physical memory, 0xb8000 is text mode VGA video memory */
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 );
}
| Safety: | |
|---|---|
| Cancellation point | No |
| Interrupt handler | No |
| Signal handler | Yes |
| Thread | Yes |
mmap(), mmap_device_io(), munmap_device_memory()