mmap()函数
参考:mmap
mmap
函数是QNX
操作系统中内存管理的核心,可以使用该函数将一个指向共享内存对象的文件描述符(或者一部分)映射仅进程地址空间中。还可以使用该函数将普通文件或类型化内存对象(typed memory objects)映射到进程地址空间中。
mmap
函数原型:
void * mmap(void *where_i_want_it,
size_t length,
int memory_protections,
int mapping_flags,
int fd,
off_t offset_within_shared_memory);
其含义是:*将一个共享内存对象中从offset_within_shared_memory
开始的length
字节映射到当前进程地址空间中,并根据memory_protections
设置访问权限,mapping_flags
决定映射行为。
参数:
where_i_want_it
: 你希望映射到的地址(通常传入0,系统会自动选择地址)length
: 映射的内存长度(单位为字节)memory_protections
: 内存访问权限mapping_flags
: 映射的类型和附加选项fd
: 共享内存对象或文件的文件描述符offset_within_shared_memory
: 映射起始偏移量
函数映射完成后会返回映射区域的地址。
访问权限(memory_protections):
宏定义 | 描述 |
PROT_EXEC | 内存可执行 |
PROT_NOCACHE | 内存不适用缓存(适用于硬件共享内存) |
PROT_NONE | 不允许任何访问 |
PROT_READ | 内存可读 |
PROT_WRITE | 内存可写 |
若访问的共享内存可能被硬件更改(如帧缓存或网卡),应使用PROT_NOCACHE
,否则可能读到缓存的旧数据。
映射类型(mapping_flags):
主要映射类型(二必选一):
映射类型 | 描述 |
MAP_SHARED | 映射可被多个进程共享,修改会同步回底层对象 |
MAP_PRIVATE | 仅进程私有,修改不会影响原始对象(复制时写机制) |
其他常用表示(可与上面组合):
MAP_ANON | 匿名映射,不关联文件,fd必须为NOFD,内存内容初始化为零 |
MAP_FIXED | 强制映射到where_i_want_it指定的地址 |
MAP_PHYS | 访问物理内存,fd设为NOFD,结合MAP_ANON可分配连续物理内存 |
注:不要对同一个文件同时使用write()
和mmap()
的共享可写映射,否则可能产生未定义行为。