Linux笔记记录2 do_fork

(´・ω・`)给自己的小小提醒:刚才看了一个大大写的关于fork的博文超级棒  加收藏了,要记得看啊

----------------------------------------------------------------------------------------------------------------------------------

首先来看三个系统调用:

sys_fork

sys_clone

sys_vfork

第一个先复制pcb再复制进程实体(写时拷贝),父子进程执行顺序不确定

第二个用来做线程(内核级线程),

第三个只复制pcb没有复制进程实体,避免调用exec产生无用功,在调用exec前与父进程共享数据(也就是共享地址空间),子进程先运行父进程阻塞,直到子进程执行exec或exit(但是现在fork功能升级啦所以vfork的作用大打折扣)。

以上三个系统调用最终都是通过do_fork实现的。


好啦,说了这么多废话终于讲到重点了,咳咳。

首先,打开我们的source insight,进入fork.c找到我们的do_fork()。

--------------------------------------------------------

long do_fork(unsigned long clone_flags,
       unsigned long stack_start,
       struct pt_regs *regs,
       unsigned long stack_size,
       int __user *parent_tidptr,
       int __user *child_tidptr)

--------------------------------------------------------

原来神秘的do_fork()长这个样子,,首先看参数:

--------------------------------------------------------

clone_flags与clone的flag参数相同

stack_start与clone的child_stack相同

regs指向通用寄存器的值。是在从用户态切换到内核态时被保存到内核态栈中的。

stack_size未使用时为0

parents_tidptr,child_tidptr-clone中对应参数ptid,ctid相同

--------------------------------------------------------

以上内容复制自fork.c

由于do_fork涉及的内容很多,这里就简略的说说他的大致过程

----------------------------------------------------------------------------------------------------------------------------------------------


是的,,偷个懒 直接丢笔记截图 懒得打字


----------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值