fork()之父子进程页表权限的设置

1 fork()系统调用

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

2 处理流程图如下

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值