1

wikipedia 上的写时复制文章说,写时复制通常是通过授予对页面的只读访问权限来实现的,因此当一个页面被写入时,页面错误陷阱处理程序可以为其映射一个唯一的物理内存页面。所以我的问题是为什么当这种页面错误发生时用户级应用程序没有收到 SIGSEGV 信号?毕竟,关于 SIGSEGV 的维基百科文章说 SIGSEGV 是当进程进行无效内存引用或分段错误时发送给进程的信号。所以在这种情况下,即写时复制的情况下,为什么没有 SIGSEGV 被发送到进程。

4

2 回答 2

4

我知道自从有人问这个问题以来已经有一段时间了,但我想稍微扩展一下 Alexey 的回答。

写时复制(我假设您在谈论虚拟内存而不是文件系统)通常是这样工作的:

  1. 操作系统知道在写入时需要复制哪些页面。(它们是进程专用的页面。)这些页面在硬件中被标记为只读。但是,进程的虚拟内存映射将页面标记为可读和可写。这意味着用户进程认为它可以完全访问相关页面。
  2. 当用户进程尝试写入其中一个页面时,会生成页面错误,因为处理器识别出该页面是只读的(基于之前的硬件标记)。页面错误有点像段错误,但对于内核而不是用户进程。
  3. 这会触发页面错误处理程序在内核中运行,它查看有问题的页面并看到它是尚未复制的私有页面。处理程序将创建页面的副本并将副本标记为可写。
  4. 然后处理程序将用虚拟到物理转换表中的新地址替换旧页面的地址并退出。
  5. 此时用户进程将重试最后一条指令,这次写入将成功,因为新页面在虚拟内存映射(用户进程的内存权限视图)和硬件(内核的视图内存权限)级别。

每次发生分段错误时都会生成一个页面错误,但大多数页面错误都由内核处理,并且永远不会作为段错误传递给导致它们的进程。页面错误可能在较低级别处理的原因有很多,包括:

  • 被访问的页面因为很长时间没有被使用而被调出到磁盘。操作系统必须将其带回内存,以便进程可以再次使用它。
  • 进程是第一次访问一个新分配的页面,实际的物理页面还没有被分配。操作系统必须分配一个页面,然后将其插入到虚拟到物理的转换表中,然后才能实际使用内存。
  • 操作系统正在播放硬件页面访问权限技巧,以允许它监视对特定页面的访问。这就是写时复制中发生的情况,但它也可以有其他用途。考虑一种操作系统级别的虚拟化技术,例如kvm,在来宾操作系统的内存中写入内存映射设备的位置实际上应该写入主机操作系统中的文件或显示。
于 2013-06-18T18:29:35.877 回答
1

COW 的主要思想是,COW 对用户进程是完全透明的,就好像它完全拥有内存而没有任何共享一样。

于 2012-04-21T03:41:46.810 回答