fork剖析資料

2021-09-14 02:42:11 字數 1408 閱讀 4452

1.首次查詢_pidmap點陣圖,為新子程序分配新的pid

2.複製程序描述符,返回的是新的程序描述符的位址(struct task_struct *p)

3.初始化完成量,vfrok主要用excv,父程序的虛擬位址空間對其沒有用處,所以實現方式為在子程序退出或者替換後父程序才開始執行

4.如果設定了vfork,則呼叫wait(父程序)

5.free_pidmap(pid):

6.返回子程序pid。

1.檢查flag位的合法性

2.為子程序獲取程序描述符

開闢核心棧+thread_info 一般大小為8k

將current的值賦給子程序

3.檢查執行緒數量,設定一些關鍵字,儲存新的pid

4.用系統呼叫時cpu暫存器中的值初始化新執行緒,將exa置為0(fork和clone在子程序的返回值)

5.完成一些欄位的設定,將新程序加入到鍊錶,將新程序pid加入到雜湊表

複製父程序每乙個vm_area_struct,也複製它的頁表,將私有的可寫的頁都標記為唯讀,為寫時拷貝做準備。

1.判斷是否為建立執行緒,如果是執行緒,直接使用mm = oldmm ,表示執行緒公用虛擬位址空間

2.對於非執行緒,為其建立虛擬位址空間,建立新的區域性描述符加入到tsk位址空間,之後呼叫dup_mmap;

後續需要解決的問題:

1.current是什麼

task_struct 包含了程序所有的資訊,current是乙個巨集,由getcurrent()->task替換,此函式內部是一條彙編指令,在x86體系下通過在核心棧尾部插入thread_info結構,計算偏移量,來查詢到當前正在執行的程序描述符。

2.使用者態fork()->核心態sys_fork()的過程是什麼

普通程式呼叫fork()-->庫函式fork()-->系統呼叫(fork功能號)-->由功能號在 sys_call_table中尋到sys_fork()函式位址-->呼叫sys_fork(),這就完成拉從使用者態到核心態的變化過程。

總結一下:

看原始碼前對fork()只停留在用上,看了之後明白了很多死記硬背的點,也有了自己的理解。主要幾個點,fork的返回值,程序和執行緒的區別,vfork現階段還暫時沒有用過先記住吧,還包括子程序繼承父程序的資訊,還有寫時拷貝的先決條件等。

fork原始碼剖析

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

fork 函式 fork 函式的使用

fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...

c 中的fork函式 FORK()函式

乙個程序,包括 資料和分配給程序的資源。fork 函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。乙個程序呼叫fork 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...