2010-03-24 42 views

回答

7

+0

這應該是被接受的答案。我會補充說'init/init_task.c'還使用'INIT_THREAD_INFO()'爲PID 0(僅在引導CPU上)設置'thread_info'和內核棧。然後,對於x86架構,'startup_32'(在'arch/x86/kernel/head_32.S'中)將指向PID 0內核堆棧的指針加載到ESP中。從那時起,Linux在PID 0的「進程上下文」中。 –

1

start_kernel()

退房rest_init()初始任務結構設置由宏INIT_TASK(),在include/linux/init_task.h定義。所有其他任務結構由do_fork創建。

+0

謝謝,我已經在看那個頁面,所以現在我知道我在正確的道路上。 哪裏有第一個task_struct創建和填充? – Tzafrir

+0

哪個進程有pid = 0?你在'init'之前談論過什麼嗎? – dotjoe

+0

我被要求解決的問題是向task_struct添加一個字段。我想初始化它,並讓每個fork()都複製它,但是找不到初始值設置的位置。 – Tzafrir

1

內核初始化的第一個進程是交換進程或空閒線程。這個線程永遠運行。當系統中沒有其他進程處於活動狀態時,該線程[在ARM架構的arch/arm/kernel/process.c中找到cpu_idle()函數]調用依賴於體系結構的pm_idle函數,該函數將CPU摺疊直到定時器中斷或其他中斷將其喚醒。

通過宏INIT_TASK在arch/arm/kernel/init_task.c中初始化swapper進程[pid = 0]。

相關問題