源码分析(一)--Fork

系统调用

简单描述:产生中断,陷入内核

详细描述:调用函数;产生0x80中断;不能继续执行main程序,被替换下去;将对应系统调用号写入eax寄存器中;在进行现场保护;陷入内核,在系统调用表中寻找eax中存放的系统调用号;将找到的返回值写回eax中;这样就得到了最终的返回值,完成了系统调用。

Fork的实现

 

 

Fork

Vfork

Clone  都是通过do_fork实现

实现流程:

在一开始,该函数定义了一个task_struct类型的指针p,用来接收即将为新进程(子进程)所分配的进程描述符。紧接着使用alloc_pidmap函数为这个新进程分配一个pid。由于系统内的pid是循环使用的,所以采用位图方式来管理。简单的说,就是用每一位(bit)来标示该位所对应的pid是否被使用。分配完毕后,判断pid是否分配成功。

 通过copy_process()创建子进程的描述符,并创建子进程执行时所需的其他数据结构,最终则会返回这个创建好的进程描述符。

1.复制进程描述符

Struct task_struct;  进程描述符/进程控制块(pcb)

最多32768

1)为子进程分配新的pid

  1. 2)复制父进程的所有属性和资源

最重要的一步:copy_process的过程

2.1)

通过dup_task_struct()为子进程分配一个内核栈、thread_info结构和task_struct结构。注意,这里将当前进程描述符指针作为参数传递到此函数中。

2.2)调用一些copy_*函数来创建新的数据结构,并把父进程的相应的数据结构的值复制到新的数据结构中

2.3)??子进程eax被设置为0,所以子进程pid=0

子进程和父进程共享时间片,不占用其他空间.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值