Linux核心 fork 原始碼分析

2021-08-11 09:25:19 字數 1117 閱讀 6362

核心版本:linux-4.4.18

原始碼位置:這裡

接著**呼叫copy_process(),它設定了程序描述符以及子程序所需的任何其他核心資料結構。

ftrace_graph_init_task()初始化ftrace,核心追蹤函式呼叫。

rt_mutex_init_task()初始化鎖。

copy_creds(p, clone_flags)拷貝父程序的訊號。

if (nr_threads >= max_threads)檢查當前使用者的最大執行緒數是否大於max_thread

pf_superpriv標誌判斷此任務是否使用超級使用者許可權,pf_forknoexec表示程序沒有呼叫exec

呼叫init_sigpending()來清除掛起的訊號。

呼叫sched_fork()來分割父子程序之間的剩餘時間片,將子程序狀態置為task_running,**見這裡。

接下來拷貝所有的程序資訊(files、fs、sighand、signal、mm、namespaces、io、thread_tls)。

alloc_pid()分配新的pid。

copy_thread_tls()函式裡面將暫存器%ax置為0,也是子程序pid返回0的原因,**點這裡。

做一些清理等工作,返回task_struct

如果返回值沒有錯誤,呼叫wake_up_new_task將程序插入執行佇列,此時狀態為task_running

如果指定了clone_vfork標誌,它會先讓子程序執行。

返回子程序的pid。

參考文獻

[1] gdb的基本工作原理

[2] 關於likely()與unlikely函式

[3] understanding the structure task_struct

Linux核心原始碼學習之fork的緩衝區

由一道面試題引出比較好,之前寫得太亂了 會顯示幾個 答案是8個 更正 圖中的一共輸出 個數錯了,應該是n 2 n個 後面是另乙個例子和比較亂的講解原因 不看也罷,兩個問題。1 fork父子程序執行順序的不同導致輸出結果的不同 上面的 看上去很簡單,子子孫孫fork就是了,基本上符合我們的一般的猜想,...

linux核心原始碼

1.機器當前使用的核心版本 apuser jianzhangubtnb uname a linux jianzhangubtnb 3.2.0 23 generic 36 ubuntu smp tue apr 10 20 39 51 utc 2012 x86 64 x86 64 x86 64 gnu ...

fork原始碼剖析

1.什麼是程序?程序可以理解為正在執行的程式。程序控制塊 pcb 有作業系統建立和管理。程序控制塊是作業系統能夠支援多程序和提供多處理的關鍵工具。2.程序的建立 1 分配pcb 2 分配位址空間 fork 建立新程序 include includepid t fork void fork 函式的每次...