Linux内核分析06
進程的描述和進程的創(chuàng)建
一,進程的描述
進程控制塊PCB——task_struct (進程描述符),為了管理進程,內(nèi)核必須對每個進程進行清晰的描述,進程描述符提供了內(nèi)核所需了解的進程信息。
struct task_struct數(shù)據(jù)結(jié)構(gòu)很龐大,進程的標示pid。
Linux進程的狀態(tài)與操作系統(tǒng)原理中的描述的進程狀態(tài)有所不同,task_running代表就緒和運行兩種狀態(tài),取決于它是否獲得CPU的控制權(quán)。
在這個龐大的數(shù)據(jù)結(jié)構(gòu)里,所有進程鏈表struct list_head tasks,一個雙向鏈表。
程序創(chuàng)建的進程具有父子關(guān)系,在進程調(diào)度中會用到,進程描述符中會有幾個域用來表示這樣的關(guān)系。
Linux為每個進程分配一個8KB大小的內(nèi)存區(qū)域,用于存放該進程兩個不同的數(shù)據(jù)結(jié)構(gòu):Thread_info和進程的內(nèi)核堆棧。
二,進程的創(chuàng)建
fork、vfork和clone三個系統(tǒng)調(diào)用都可以創(chuàng)建一個新進程,而且都是通過調(diào)用do_fork來實現(xiàn)進程的創(chuàng)建。 ? ?
fork在父進程和子進程之間各返回一次。
fork出的子進程從哪里開始執(zhí)行? fork的進程給了一個系統(tǒng)調(diào)用,和傳統(tǒng)系統(tǒng)調(diào)用創(chuàng)建進程過程時不同。ret_from_fork
?
p指向的是ret_from_fork,所以是從這里開始執(zhí)行的。
復(fù)制內(nèi)核堆棧的時候是復(fù)制的pt_regs,即只復(fù)制了SAVE_ALL相關(guān)的那一部分,即系統(tǒng)調(diào)用壓棧的那一部分。
pt_regs里面內(nèi)容有:
Entry(ret_from_fork):
最終會跳轉(zhuǎn)到syscall_exit,這之前的內(nèi)核堆棧狀態(tài)和syscall_call的一致,然后返回用戶態(tài),變成子進程的用戶態(tài)。
?
創(chuàng)建新進程通過復(fù)制已有進程來實現(xiàn),子進程的許多數(shù)據(jù)結(jié)構(gòu)需要修改,需要一個新的內(nèi)核堆棧,該內(nèi)核堆棧一部分也是從父進程復(fù)制過來的,以為需要返回進程。
子進程的fork返回0,因為“childregs->ax?=?0;?”。
系統(tǒng)調(diào)用內(nèi)核處理函數(shù):sys_fork,sys_clone,sys_vfork。
復(fù)制的內(nèi)核堆棧時只復(fù)制了內(nèi)核堆棧最棧底的部分,例如:SAVE_ALL,int指令等。
使用gdb跟蹤創(chuàng)建新進程的過程
各種函數(shù):
?
進程創(chuàng)建的分析
3.要修改復(fù)制過來的進程數(shù)據(jù),比如pid、進程鏈表等,見copy_process內(nèi)部。
系統(tǒng)調(diào)用內(nèi)核處理函數(shù)sys_fork,sys_vfrok,sys_clone,其實最終執(zhí)行的都是do_fork。
do_fork里有:
三,心得
在Linux內(nèi)核的分析里,線程被視作一種特殊的進程,和一般的操作系統(tǒng)里不同,進程的創(chuàng)建和調(diào)度都是關(guān)鍵的動作。
轉(zhuǎn)載于:https://www.cnblogs.com/KG35/p/5329850.html
總結(jié)
以上是生活随笔為你收集整理的Linux内核分析06的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ant-design-vue——Warn
- 下一篇: linux 其他常用命令