为什么写入时副本上没有SIGSEGV信号?

时间:2012-04-21 03:34:57

标签: memory-management operating-system copy-on-write page-fault

copy-on-write article on wikipedia表示写入时复制通常是通过对页面进行只读访问来实现的,因此在编写页面时,页面错误陷阱处理程序可以为其映射唯一的物理内存页面。所以我的问题是为什么用户级应用程序在发生此类页面错误时没有收到SIGSEGV信号?毕竟,wikipedia article on SIGSEGV表示SIGSEGV是在进行无效内存引用或分段错误时发送给进程的信号。因此,在这种情况下,这是写时复制的情况,为什么没有SIGSEGV被发送到进程。

2 个答案:

答案 0 :(得分:3)

我知道这已经有一段时间了,但是我想扩展一下Alexey的答案。

写时复制(我假设你所说的是虚拟内存,而不是文件系统)通常是这样的:

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

    • 访问的页面被分页到磁盘,因为它很长时间没有使用过。操作系统必须将其恢复到内存中,以便进程可以再次使用它。
    • 该进程首次访问新分配的页面,尚未分配实际物理页面。在实际使用内存之前,操作系统必须分配一个页面,然后将其插入到虚拟到物理转换表中。
    • 操作系统正在播放硬件页面访问权限技巧,以允许它监视对特定页面的访问。这是写时复制时发生的情况,但它也可以有其他用途。考虑像kvm这样的操作系统级虚拟化技术,其中写入内存映射设备在来宾操作系统内存中的位置实际上应该写入主机操作系统中的文件或显示器。

答案 1 :(得分:1)

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