Skip to content

cpp_mmap

mmap 函数原型

函数原型如下:

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

参数说明如下:
start  : 映射区的开始地址,有时设为 0 的意思是让内核去处理分配位置
length : 映射区的长度
prot   : 期望的内存保护标志(通俗说,就是决定这个内存页有哪些权限,如 r-x, rwx)
flags  : 指定映射对象的类型,映射选项和映射页是否可以共享。
fd     : 有效的文件描述词。如果 flags 中 有 MAP_ANONYMOUS ,为了兼容问题,其值应为-1
offset : 被映射对象内容的起点

prot 有如下设置:

#define PROT_READ    0x1        /* page can be read */
#define PROT_WRITE    0x2        /* page can be written */
#define PROT_EXEC    0x4        /* page can be executed */
#define PROT_SEM    0x8        /* page may be used for atomic ops */
#define PROT_NONE    0x0        /* page can not be accessed */
#define PROT_GROWSDOWN    0x01000000    /* mprotect flag: extend change to start of growsdown vma */
#define PROT_GROWSUP    0x02000000    /* mprotect flag: extend change to end of growsup vma */

flags 有如下设置(以后遇到再补):

| MAP_FIXED     | 0x10   | 如果我们想要映射的一段区域,内存已经有内容了,那么就覆盖掉原内容               |
| MAP_SHARED    | 0x01   | 创建一个共享映射的区域,多个进程可以映射到一个文件,修改后内容会同步到磁盘中   |
| MAP_PRIVATE   | 0x02   | 创建一个私有的写时复制的映射,其他进程看不到映射内容的改变,也不会同步到磁盘中 |
| MAP_TYPE      | 0x0f   | /* Mask for type of mapping */                                                 |
| MAP_ANONYMOUS | 0x20   | 匿名映射,映射区不与任何文件关联。此时fd应设置为-1。                           |
| MAP_GROWSDOWN | 0x0100 | 告诉内核VM系统,映射区可以向下扩展。                                           |
| MAP_DENYWRITE | 0x0800 | 没有用的标志                                                                   |

成功执行时, mmap() 返回被映射区的指针。

Comments