如果建立子程序,那麼還有如下場景需要處理do_fork
=>struct pid *pid = alloc_pid();
=>struct pid *pid = kmem_cache_alloc(pid_cachep, gfp_kernel);//分配pid結構體空間
=>nr = alloc_pidmap(current->nsproxy->pid_ns);//分配pid程序號
=>pid->nr = nr;//關聯
=>for (type = 0; type < pidtype_max; ++type)//初始化程序pid, pgid和sid私有hash表
==>init_hlist_head(&pid->tasks[type]);
=>hlist_add_head_rcu(&pid->pid_chain, &pid_hash[pid_hashfn(pid->nr)]);//將程序pid加入程序全域性hash表
=>return pid;//返回pid結構體
=>p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, pid);//拷貝父程序的東東到子程序
=>p = dup_task_struct(current);
=>struct task_struct *tsk = alloc_task_struct();
=>struct thread_info *ti = alloc_thread_info(tsk);
=>*tsk = *orig;//建立task_struct和thread_info的關係
tsk->stack = ti;
setup_thread_stack(tsk, orig);
=>retval = copy_files(clone_flags, p)//拷貝父程序的資源
retval = copy_fs(clone_flags, p)
retval = copy_sighand(clone_flags, p)
retval = copy_mm(clone_flags, p)
=>if (clone_flags & (clone_parent|clone_thread))//建立父子關係和夥伴關係列表
p->real_parent = current->real_parent;
else
p->real_parent = current;
p->parent = p->real_parent;
=>if (clone_flags & clone_thread)//如果是執行緒,則認祖歸宗,找到組織
=>p->group_leader = current->group_leader;
=>list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);//插入到領頭執行緒的鍊錶;新版本取消掉了tgid雜湊表
=>if (likely(p->pid))
==>add_parent(p);
==>if (thread_group_leader(p))
p->signal->tty = current->signal->tty;
p->signal->pgrp = process_group(current);
set_signal_session(p->signal, process_session(current));
attach_pid(p, pidtype_pgid, task_pgrp(current));//將p加入到當前程序的各種雜湊鍊錶中
=>struct pid_link *link;
link = &task->pids[type];
link->pid = pid;//指向領頭程序的pid
hlist_add_head_rcu(&link->node, &pid->tasks[type]);//加到領頭程序的雜湊表
attach_pid(p, pidtype_sid, task_session(current));
list_add_tail_rcu(&p->tasks, &init_task.tasks);
==>attach_pid(p, pidtype_pid, pid);
=>retval = copy_thread_tls(clone_flags, stack_start, stack_size, p, tls);
frame->ret_addr = (unsigned long) ret_from_fork; // 新程序的第一條指令
=>wake_up_new_task(p, clone_flags);//將新程序加到就緒佇列,專門一章用來講這個
=>return nr;//返回進行pid給應用層,pid結構體對應用層不可見
載入子程序會通過execve系統呼叫進行if (clone_flags & clone_vfork)//clone_vfork代表建立子程序
wait_for_completion(&vfork);//等一下子程序
程序名在核心態如何獲取,方法是 current->comm,作為字串列印即可.load_binary = load_aout_binary
=>retval = flush_old_exec(bprm);
=>retval = exec_mmap(bprm->mm);
=>mm_release(tsk, old_mm);
=>if (vfork_done)
程序排程二 程序建立do fork
一 前言 kernel在啟動初期並沒有 程序 這個概念,因為不涉及多工併發 排程,kernel 起來後會在start kernel 中建立kthread和init程序,在0號程序的基礎上建立init程序 pid為1 0 程序會被設定成idle程序,加入到執行 佇列中。當cpu上沒有可排程程序時,排程...
OS之程序排程
處理機排程 在多道程式程式的環境中,記憶體中存在著多個程序,程序往往大於處理機數目,這就要系統按照某種演算法,動態的將處理機分配給處於就緒狀態的程序。是之執行,分配處理機的任務就是由處理機排程完成的。排程實質上是一種資源分配。處理機排程演算法的目標 處理價排程演算法的共同目標 1 資源利用率,為了提...
程序排程之喚醒
關於 wait event interruptible中的for迴圈裡面的condition怎麼才能為真,自己很迷惑,因為如果condition為真,那麼在wait event interruptible就直接退出了。根本走不到for迴圈裡面。define wait event interrupti...