mmap是什么?

16

这行代码是做什么的?

mmap(NULL, n, PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
2个回答

18

它请求一个大小为n字节的私有、可写的匿名映射内存。

  • 私有映射意味着它不与其他进程共享(例如,在fork()之后,子进程和父进程将具有独立的映射);
  • 匿名映射意味着它没有由文件支持。

在这种情况下,它基本上是请求一块n字节的内存,因此大致相当于malloc(n)(虽然必须使用munmap()而不是free()释放内存,并且它将被页面对齐)。它还要求内存是可写的,但不要求可读,但是可写但不可读的内存通常不是底层硬件支持的组合。当仅请求PROT_WRITE时,POSIX允许实现提供还可以读和/或执行的内存。


在x86上,PROT_WRITE意味着PROT_READ,并且POSIX允许这样做。 - Iwillnotexist Idonotexist

12

man mmap会对你有所帮助。

它在进程的虚拟地址空间中创建一个内存映射。它创建了一个匿名映射,有点像使用malloc分配n字节的内存。

参数包括:

  • NULL - 内核会为映射选择一个地址
  • n - 映射长度(以字节为单位)
  • PROT_WRITE - 可写入页面
  • MAP_ANON | MAP_PRIVATE - 映射不由文件支持,对映射的更新是进程私有的
  • -1 - 文件描述符;因为映射不由文件支持,所以未使用
  • 0 - 在文件中的偏移量,在这里也没有使用,因为映射不由文件支持

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接