mmap和内核内存

时间:2013-09-09 16:05:02

标签: linux kernel mmap

我从mmap() internals了解mmap读取的工作原理 - 导致页面错误 - 将文件数据从磁盘复制到内部内核缓冲区 - 将内核缓冲区映射到用户空间

我的问题是:

  • 内核映射到缓冲区会发生什么?如果它仍然存在,那么我们在用户应用程序获取内核内存的访问权限吗?
  • 我们用这种方式耗尽了物理内存?我假设内核需要最少的物理内存来提供相当级别的性能,如果我们继续将它的缓冲区分配给mmapped用户空间缓冲区,我们最终会用完缓冲区。
  • 在写入期间,相关内存是否临时映射到内核缓冲区?如果这是一个共享的maping,另一个用户进程可以访问并再次访问现在的内核内存

谢谢,对不起,如果这些问题非常基本,但我没有找到明确的答案。

1 个答案:

答案 0 :(得分:0)

我不是任何方式的内核黑客,但这是我收集的内容:

  • 我不完全确定内核是否“放弃”其映射到物理内存的问题,因为内核可以访问它喜欢的任何物理内存。但是,如果用户进程也可以访问该内存,为了用户进程和为了用户进程,内核显然不允许继续将该物理内存用于其自身目的(例如作为内部管道缓冲区)。内核。内核将简单地将这些页面指定为文件系统缓存的一部分(如果由文件支持)而不是弄乱它们。
  • 是的,其程度与任何进程或进程数可以通过请求管道等大量资源来限制内核的物理内存量相同。但是,内核会跟踪可用的物理内存量,并在剩余的物理内存量不足时开始将用户区内存分页到磁盘。由于包括性能在内的原因,通常不应将内核内存本身分页到磁盘。虽然由文件支持的mmap()内存的好处是,它可以轻松地分页到磁盘;不需要分配交换空间。
  • 如果您的意思是写入映射到用户空间虚拟地址空间的可用内存(即memcpy(),而不是write()),请执行。 mmap()的重点是将用户空间虚拟地址空间映射到物理内存,以允许读取和写入,而无需借助系统调用。磁盘的同步将由内核直接执行,无需额外复制到内核缓冲区。