5

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

我的问题是:

  • 内核映射到缓冲区会发生什么?如果它仍然存在,我们这里是否存在用户应用程序访问内核内存的问题?
  • 我们不能这样用完物理内存吗?我假设内核需要最少数量的物理内存来提供不错的性能水平,如果我们继续将它的缓冲区分配给映射的用户空间缓冲区,我们最终会用完缓冲区。
  • 在写入期间,相关内存是否会临时映射到内核缓冲区?如果这是一个共享映射,另一个用户进程可以访问并再次访问现在的内核内存

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

4

1 回答 1

0

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

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