标签:
作者:严哲璟
原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
fork属于系统调用,而此系统调用创建一个子进程,由于其为系统调用,所以基本的用户态到内核态的切换,以及中断的处理,都与普通的系统调用一样,分为3个主要过程
1.调用fork这个API,然后软中断,进入内核态,堆栈切换到内核堆栈,保存用户态sp,cs:eip;
2.执行system_call,然后SAVE_ALL,根据eax寻找系统调用表中对应的中断服务程序,这里是sys_clone
3.执行sys_clone
与普通的系统调用不一样的是,sys_clone需要执行do_fork,产生一个新的进程
下面是相关的流程图:
do_fork()
{
copy_process(....){ //复制进程相关信息
dup_tusk_struct(current){ //复制PCB
alloc_task_struct_node() //相关PCB指针赋值
arch_dup_task_struct()
alloc_thread_info_node() //创建8KB大小的内存空间放置stack以及thread_info,返回stack起始地址ti
setup_thread_info() //初始化thread_info
}
对新进程P的其他信息修改,因为所有信息都是复制的所以必须修改
retval=copy_thread(P) //设置新进程的起始地址,新进程的内核堆栈
}
}
下面详细说进程创建以及堆栈的切换(此时在执行fork的父进程中)
copy_thread()
p->thread.ip=ret_from_fork //新进程的入口地址
p->thread.sp=childregs //将新进程的内核堆栈指向
childregs=current_pt_regs
childregs->sp=sp;
标签:
原文地址:http://www.cnblogs.com/yzjustc/p/5350876.html