1 fork()系统调用
fork()系统调用用来生成子进程,而现有Linux系统运行在写时拷贝的机制下,于是fork()函数在为子进程建立内核中各种管理结构的时候,并没有将真实的物理资源分配给子进程,而只是将父进程的物理资源共享给子进程,比如:fork()函数会将父进程的物理内存共享给子进程,即将父进程多级页表的内容复制到子进程新建立的多级页表中。然而在这种机制下,对于父进程中那些原本可读可写的页,一旦被共享给子进程之后,两个进程中任何一个对该物理页内容进行了修改,将会影响另外一个进程的正常使用,于是,内核解决此问题的方法是:在将父进程的多级页表复制到子进程的多级页表中时,会将之前对于父进程来说可写的物理页对应的页表项,在父子进程的多级页表中都设置为只读,因此,一旦两个进程中的任何一个对某个写保护(只读)的物理页发生了写操作,就会导致pagefault,相应的内核函数会处理并识别出这种写时拷贝机制导致的错误,并复制该物理页的内容到一个新的物理页,并将新的物理页链接到发生写操作的进程的多级页表中,最后恢复该物理页对应表项的写权限,恢复进程对该物理页的写操作,做到进程无感知的处理。