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()
返回被映射区的指针。