fork

fork的实现 首先fork实质上是开了一个新的子进程 同父进程的代码是一样的,但是拥有的地址空间和进程pid号不同

意思是仅有执行的功能相同

 

书上实现fork的方法首先是给每个进程都增加了一个新属性 就是parent_pid 然后 开始fork()被调用时 会先为fork在内核内存池中分配一页空间 

分配的这一页空间 首先 是在内核内存池中分配一个物理地址 然后在内核的虚拟地址池中分配一个地址 映射在一起就OK了

之后就是为子进程逐渐添加资源 首先是将父进程的整页pcb复制过来 然后将parent_pid、ticks等信息初始化 此时 子进程的用户虚拟空间还是指向父进程的

所以要为子进程重新分配一个 emmm 过程为先把需要的页和虚拟地址在内核内存池中分配好 然后再把子进程指向的用户虚拟空间内容给复制过去 然后将子进程指向用户虚拟地址池的指针给指过去 分配完毕

之后是为用户将3级栈填充 过程为 把父进程的虚拟地址池的位图遍历  将其中被占用的位重新在子进程中分配一页 并将数据填充过去 其中涉及进程拥有独立的地址空间 所以在申请页表时需要将cr3寄存器更新为子进程的页目录表地址

然后是为用户构建0级栈 0级栈处于pcb顶端 intr_stack下面所以 要先越过中断栈 然后将 esi edi ebx ebp 的顺序 对应从高地址到低地址的顺序写入 并将返回地址设置为从中断退出的intr_exit函数 

然后就是更新inode的打开输数 结束

posted @ 2017-12-14 21:15  菜比170  阅读(300)  评论(0编辑  收藏  举报