

copy_process作為do_fork的主心骨,其流程并不複雜,隻是每一步調用的初始化函數都非常精妙,涉及到大量的内知識和代碼,這裡為了篇幅着想就不繼續往細節分析了,會在之後的文章中慢慢補全其中的知識和自己的了解。整篇文章讀下來,其實copy_process的核心就是初始化task_struct結構體供新程序(線程)使用,并為其配置設定獨有的pid,最後将其加入到運作隊列中。而至于為什麼應用層調用fork()會進行兩次傳回,原理就是在核心棧中,在copy_thread函數中父程序将其核心棧複制到子程序中,把子程序被排程後執行的第一條語句設定為do_fork()傳回,并把儲存傳回值的寄存器值(一般傳回值儲存在eax(ARM是r0),而這些通用寄存器值儲存在核心棧中,當調用後會進行程序切換,會把這些儲存于核心棧的寄存器值還原到寄存器中)置為0,是以子程序的傳回值為0,而父程序會繼續執行copy_thread函數之後的初始化,最後傳回子程序的pid(實際上是tgid)。
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/8080607.html,如需轉載請自行聯系原作者