2015-11-03 94 views
1

當我們撥打fork()。它打電話給系統調用克隆其中調用do_fork功能,在這個函數裏面,它調用copy_processcopy_process調用dup_task_struct它爲新進程創建新的內核堆棧,新的task_struct,新的thread_info。如果exec稱之爲創建新流程。用戶空間堆棧何時在調用fork之後創建?

但是,當用戶空間堆棧在創建過程的這個序列中創建時, 我對線程有同樣的問題。

用戶空間棧還有指向task_struct或thread_info類型結構的指針嗎?

請幫我在這裏並糾正我,如果我問一些愚蠢的。

回答

1

在fork()中,用戶堆棧未創建。用戶堆棧由mm_struct的vm_area_struct表示。 do_fork調用copy_mm,它複製只有在未設置CLONE_VM標誌時才調用fork的新進程的mm_struct。 如果設置,在創建線程的情況下,它只會將mm_user的計數和新任務mm指向當前任務的計數mm。

只有當調用exec時調用do_execve調用bprm_mm_init,調用allocate_mm從mm_cachep板中分配(當然內存也需要爲新進程重複mm),然後mm_init初始化mm結構,爲頁面全局目錄分配內存。

然後調用__bprm_mm_init創建用戶空間堆棧,該堆棧是堆棧的vm_area_struct結構