Linux系統fork執行過程

鄭德倫 原創作品轉載請註明出處 《Linux內核分析》MOOC課程
http://mooc.study.163.com/course/USTC-1000029000
一、配置環境:
首先我們把環境配置完成
在實驗樓中輸入

rm menu –rf
git clone https://github.com/mengning/menu.git
cd menu
mv test_fork.c test.c
make rootfs

啓動MenuOS後發現fork已經被加入到了MenuOS中了

這裏寫圖片描述
二、跟蹤調試fork
輸入qemu –kernel ../linux-3.18.6/arch/x86/boot/bzImage –initrd ../rootfs.img –s –S
然後在另一個終端輸入

gdb
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234
(gdb)b sys_clone
(gdb)b do_fork
(gdb)b dup_task_struct
(gdb)b copy_process
(gdb)b copy_thread
(gdb)b ret_from_fork

設置好斷點之後 我們進行跟蹤fork的過程
首先會觸發sys_clone的系統調用
這裏寫圖片描述
然後進入do_fork函數
這裏寫圖片描述
在do_fork函數中會調用copy_process
這裏寫圖片描述
在copy_process中調用dup_task_struct和copy_thread
這裏寫圖片描述
這裏寫圖片描述
最後調用ret_from_fork()完成進程的fork
這裏寫圖片描述
整個過程我們用流程圖表示一下:
這裏寫圖片描述
三、總結
Linux創建一個新進程時,可能會使用到sys_vfork sys_clone sys_fork系統調用,但是這三個系統調用都會調用do_fork函數,do_fork會調用copy_process來複制父進程的資源給子進程。在copy_process中有各種copy_xxx 函數來進行復制初始化工作。完成各項工作之後會執行ret_from_fork,這是子進程的起點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章