copy_process
2011-7-14 16:00:12
if ((clone_flags & (CLONE_NEWNS|CLONE_FS)) == (CLONE_NEWNS|CLONE_FS))
return ERR_PTR(-EINVAL);
想有新的命名空间就不能共享文件
if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND))
return ERR_PTR(-EINVAL);
如果是创建线程就需要共享信号
if ((clone_flags & CLONE_SIGHAND) && !(clone_flags & CLONE_VM))
return ERR_PTR(-EINVAL);
共享信号处理就需要共享地址空间
retval = security_task_create(clone_flags);
进行安全检测
p = dup_task_struct(current);
复制进程描述符
dup_task_struct 流程
alloc_task_struct
#define alloc_thread_info(tsk) \
((struct thread_info *)__get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER))
分配了2个页的空间
*tsk = *orig;
按值进行拷贝
tsk->thread_info = ti;
设置了自己的thread_info
setup_thread_stack(tsk, orig);
也是按值拷贝
atomic_set(&tsk->usage,2);
atomic_set(&tsk->fs_excl, 0);
if (atomic_read(&p->user->processes) >=
p->signal->rlim[RLIMIT_NPROC].rlim_cur) {
if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
p->user != &root_user)
goto bad_fork_free;
}
进行资源限制判断
如果系统支持SYSV IPC 还需要拷贝这些信息
get_undo_list
如果当前进程有undo list,就使用当前进程的undo list,否则还需要创建一个新的
如果flags中有 CLONE_SYSVSEM
就将undo list的引用计数加1
否则就置为null