1. 程式人生 > >Linux最初的幾個程序

Linux最初的幾個程序

0號程序

0號程序,被叫做idle程序或swapper程序,是核心初始化完後的第一個程序,也是唯一一個不由fork或kernel_thread建立的程序。當然,“核心初始化完成後的第一個程序”這種說法並不準確,0號程序本身就是核心的一部分。 多處理系統上,一個cpu有著一個0號程序。

Linux系統在初始化的時候,會使用INIT_TASK靜態建立一個程序描述符

struct task_struct init_task = INIT_TASK(init_task);

INIT_TASK是一個巨集定義,靜態建立其實就是在宣告並初始化 init_task 這個結構體 (init_task是全域性變數,故而也可將其看作是核心初始化程序的程序描述符,雖然這時候還沒有程序這一概念)

在核心初始化的中間階段(start_kernel的中間),會呼叫 sched_init() 進行排程初始化,其中會呼叫 idle_init() 進行 idle 程序的初始化,其中除了設定一些程序引數以外,另一個很重要的目的就是將當前程序的程序描述符賦值給rq結構體的idle程序的程序描述符(rq即runningqueue,執行佇列,是一個結構體,每個cpu獨有一個,在較舊的核心版本中,idle程序是放在排程佇列中和其他程序一同排程的,在較新的核心中,則設定了idle程序描述符指標,指向idle程序的程序描述符,當無其他程序可排程時則排程idle程序)

void __init sched_init(void)
	···
	init_idle(current, smp_processor_id());
void __cpuinit init_idle(struct task_struct *idle, int cpu)
	...
	rq->curr = rq->idle = idle;

在核心初始化的最後階段(start_kernel的最後),核心會呼叫 rest_init(),其中進行了 kernel_init 程序和 kthreadd 程序的建立,並將當前程序的排程類置為idle排程類

最後呼叫 cpu_idle() 後,這個核心初始化的程序就徹底蛻變為了 idle 程序(也就是說idle程序的任務就是cpu_idle()中的while迴圈)

值得一提的是,這裡的idle程序僅是主處理器的idle程序,其他處理器的idle程序是在init程序中建立的。

ps:現在仍然不是很明白的是,init_task和current很明顯是有關係的,但仍然沒找到將二者關聯起來的地方,只是知道在arm架構下,current是通過sp指標得到thread_info中的task,至於init_task是何時進入一個thread_info結構體,又何時入棧的,尚且不明