原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
一、进程创建
fork系统调用
- 通过调用do_fork来实现进程的创建;
- 复制父进程PCB–task_struct来创建一个新进程,要给新进程分配一个新的内核堆栈;
- 修改复制过来的进程数据,比如pid、进程链表等等执行copy_process和copy_thread
- 成功创建新进程
调用过程:fork()-> sys_clone() -> do_fork() -> dup_task_struct() -> copy_process() -> copy_thread() -> ret_from_fork()
其中关键函数do_fork代码如下:
long do_fork(unsigned long clone_flags,
unsigned long stack_start,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
{
struct task_struct *p;
int trace = 0;
long nr;
p = copy_process(clone_flags, stack_start, stack_size,
child_tidptr, NULL, trace);
if (!IS_ERR(p)) {
struct completion vfork;
struct pid *pid;
trace_sched_process_fork(current, p);
pid = get_task_pid(p, PIDTYPE_PID);
nr = pid_vnr(</