窥探 kernel,just for fun --- sys_fork,sys_vfork,sys_
2019-07-12 23:04 发布
生成海报
分类: 嵌入式linux kernel篇 2012-04-19
22:31 245人阅读 收藏 举报
本系列文章由张同浩编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7479379
邮箱:muge0913@sina.com
用户空间进程创建接口:fork,vfork,clone函数,这里只做简单说明。
fork:使用该系统调用时,子进程复制父进程的全部资源。由于要复制父进程进程描述符给子进程(进程描述的结构很大!!),这一过程开销是很大的。linux采用了”写时复制技术”(copy on write,COW),使子进程先共享父进程的物理页,只有子进程进行写操作时,再复制对应的物理页,避免了无用的复制开销,提高了系统的性能。
实现代码(x86):arch/x86/kernel/process.c
[cpp] view
plain copy print ?
int sys_fork( struct pt_regs *regs)
{
return do_fork(SIGCHLD, regs->sp, regs,0, NULL, NULL);
}
实现代码(arm):arch/arm/kernel/sys_arm.c
[cpp] view
plain copy print ?
asmlinkage int sys_fork( struct pt_regs *regs)
{
#ifdefCONFIG_MMU
return do_fork(SIGCHLD, regs->ARM_sp,regs, 0, NULL, NULL);
#else
return (-EINVAL);
#endif
}
vfork:该系统调用创建的子进程,完全运行在父进程地址空间之上。子进程对地址空间任何数据的修改同样为父进程所见。vfork执行后父进程堵塞,知道子进程运行结束。
实现代码(x86):arch/x86/kernel/process.c
[cpp] view
plain copy print ?
intsys_vfork( struct pt_regs *regs)
{
return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->sp, regs, 0,NULL, NULL);
}
实现代码(arm):arch/arm/kernel/sys_arm.c
[cpp] view
plain copy print ?
asmlinkage intsys_vfork( struct pt_regs *regs)
{
return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);
}
clone:该调用是linux系统所特有的,其NPTL的实现依赖此函数。与fork,vfork相比clone对进程创建有更好的控制能力,能控制子进程和父进程共享何种资源。
实现代码(x86):arch/x86/kernel/process.c
[cpp] view
plain copy print ?
long sys_clone(unsignedlong clone_flags, unsigned long newsp,
void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
{
if (!newsp)
newsp = regs->sp;
return do_fork(clone_flags, newsp, regs, 0,parent_tid, child_tid);
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮