mmap 和内核内存

use*_*398 5 linux kernel mmap

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

我的问题是:

  • 内核映射到缓冲区会发生什么情况?如果它仍然存在,那么我们是否会遇到用户应用程序访问内核内存的问题?
  • 难道我们就不能用这种方式耗尽物理内存吗?我假设内核需要最少的物理内存来提供良好的性能水平,如果我们继续将其缓冲区分配给映射的用户空间缓冲区,我们最终会耗尽缓冲区。
  • 在写入期间,相关内存是否会临时映射到内核缓冲区?如果这是共享映射,则另一个用户进程可以访问并再次访问现在的内核内存

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

Nav*_*eth 0

无论如何,我不是内核黑客,但这是我收集到的:

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