LINUX内核进程创建分析
目录
1 函数跟踪
几乎所有的工作都由 copy_process
完成。
kernel/fork.c: SYSCALL_DEFINE0(fork) { return _do_fork(SIGCHLD, 0, 0, NULL, NULL, 0); } SYSCALL_DEFINE0(vfork) { return _do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0, 0, NULL, NULL, 0); } SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp, int __user *, parent_tidptr, int __user *, child_tidptr, unsigned long, tls) { return _do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr, tls); } clone/fork └─ do_fork ├ copy_process ├ dd_latent_entropy(void) // Randomize Entrypy ├ init_completion depends on flags ├ wake_up_new_task(struct task_struct *p) └ wait_for_vfork_done copy_process ├─ flags check ├─ dup_task_struct(struct task_struct *orig, int node) │ ├─ alloc_thread_stack_node(struct task_struct *tsk, int node) │ ├─ setup_thread_stack(struct task_struct *p, struct task_struct *org) │ ├─ clear_user_return_notifier(struct task_struct *p) │ ├─ clear_tsk_need_resched(struct task_struct *tsk) │ ├─ setup_thread_stack(struct task_struct *p, struct task_struct *org) │ │ // Notes: set stack end to 0x57AC6E9D for overflow detection │ ├─ tsk->stack_canary = get_random_canary(); // randomize 0-255 bytes │ ├─ account_kernel_stack(struct task_struct *tsk, int account) │ │ // Notes: Update page statistics │ └─ kcov_task_init(struct task_struct *t) // coverage ├─ ftrace_graph_init_task(struct task_struct *t) // Function Tracer ├─ rt_mutex_init_task(struct task_struct *p) ├─ copy_creds(struct task_struct *p, unsigned long clone_flags) ├─ delayacct_tsk_init(struct task_struct *tsk) ├─ rcu_copy_process(struct task_struct *p) ├─ init_sigpending(struct sigpending *sig) ├─ misc accounts init ... ├─ sched_fork(unsigned long clone_flags, struct task_struct *p) ├─ copy files, fs, sighand, signal, mm, ns, io, tls, init tracer └─ uprobe_copy_process(struct task_struct *t, unsigned long flags)