码迷,mamicode.com
首页 > 其他好文 > 详细

do_fork() 源码剖析

时间:2018-01-28 20:03:12      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:源码   图片   dma   使用   分配   free   read   空间   私有   

  分析一下do_fork()的源码的主要步骤

1.首次查找_pidmap位图,为新子进程分配新的pid

技术分享图片

2.复制进程描述符,返回的是新的进程描述符的地址(struct task_struct *p)

技术分享图片

3.初始化完成量,vfrok主要用excv,父进程的虚拟地址空间对其没有用处,所以实现方式为在子进程退出或者替换后父进程才开始执行

 

技术分享图片

4.如果设置了vfork,则调用wait(父进程)

5.free_pidmap(pid):

6.返回子进程pid。

 

对于第二步,是do_fork的关键

1.检查flag位的合法性

2.为子进程获取进程描述符

技术分享图片

  开辟内核栈+thread_info 一般大小为8k

  将current的值赋给子进程

 

  技术分享图片

3.检查线程数量,设置一些关键字,保存新的pid

4.用系统调用时cpu寄存器中的值初始化新线程,将exa置为0(fork和clone在子进程的返回值)

技术分享图片

 

 5.完成一些字段的设置,将新进程加入到链表,将新进程pid加入到散列表

 

技术分享图片

复制父进程每一个vm_area_struct,也复制它的页表,将私有的可写的页都标记为只读,为写时拷贝做准备。

 

技术分享图片

 

 1.判断是否为创建线程,如果是线程,直接使用mm = oldmm ,表示线程公用虚拟地址空间

2.对于非线程,为其创建虚拟地址空间,创建新的局部描述符加入到tsk地址空间,之后调用dup_mmap;

 

后续需要解决的问题:

1.current是什么

2.用户态fork()->内核态sys_fork()的过程是什么

3.copy_mm 在什么时候用的
 

do_fork() 源码剖析

标签:源码   图片   dma   使用   分配   free   read   空间   私有   

原文地址:https://www.cnblogs.com/zhangtiezi/p/8372080.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!