窥探 kernel,just for fun --- sys_fork,sys_vfork,sys_

2019-07-12 23:04发布


分类: 嵌入式linux kernel篇 245人阅读 评论(2) 收藏 举报 本系列文章由张同浩编写,转载请注明出处: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 plaincopyprint?
  1. int sys_fork(struct pt_regs *regs)  
  2. {  
  3.      return do_fork(SIGCHLD, regs->sp, regs,0, NULL, NULL);  
  4. }  

实现代码(arm):arch/arm/kernel/sys_arm.c [cpp] view plaincopyprint?
  1. /* Fork a newtask - this creates a new program thread. 
  2.  * This is called indirectly via a smallwrapper 
  3.  */  
  4. asmlinkage int sys_fork(struct pt_regs *regs)  
  5. {  
  6. #ifdefCONFIG_MMU  
  7.      return do_fork(SIGCHLD, regs->ARM_sp,regs, 0, NULL, NULL);  
  8. #else  
  9.      /* can not support in nommu mode */  
  10.      return(-EINVAL);  
  11. #endif  
  12. }  

  vfork:该系统调用创建的子进程,完全运行在父进程地址空间之上。子进程对地址空间任何数据的修改同样为父进程所见。vfork执行后父进程堵塞,知道子进程运行结束。 实现代码(x86):arch/x86/kernel/process.c [cpp] view plaincopyprint?
  1. intsys_vfork(struct pt_regs *regs)  
  2. {  
  3.      return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->sp, regs, 0,NULL, NULL);  
  4. }  

实现代码(arm):arch/arm/kernel/sys_arm.c [cpp] view plaincopyprint?
  1. asmlinkage intsys_vfork(struct pt_regs *regs)  
  2. {  
  3.      return do_fork(CLONE_VFORK | CLONE_VM |SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);  
  4. }  

clone:该调用是linux系统所特有的,其NPTL的实现依赖此函数。与fork,vfork相比clone对进程创建有更好的控制能力,能控制子进程和父进程共享何种资源。 实现代码(x86):arch/x86/kernel/process.c [cpp] view plaincopyprint?
  1. long sys_clone(unsignedlong clone_flags, unsigned long newsp,  
  2.       void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)  
  3. {  
  4.      if (!newsp)  
  5.          newsp = regs->sp;  
  6.      return do_fork(clone_flags, newsp, regs, 0,parent_tid, child_tid);