從start_kernel到init進程啟動的過程

首先按照課程中的內容編譯并用gdb+qemu調試運行我們的Linux操作系統(tǒng).其命令如下:

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

再打開另一個終端窗口,進入gdb,如下:

gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加載符號表
(gdb)target remote:1234 # 建立gdb和gdbserver之間的連接,按c 讓qemu上的Linux繼續(xù)運行
(gdb)break start_kernel # 斷點的設置可以在target remote之前丙号,也可以在之后
(gdb)c #繼續(xù)運行,使得qemu開始繼續(xù)執(zhí)行并在start_kernel函數入口停下.

結果如圖1所示:


圖1

start_kernel()中調用了一系列初始化函數湿右,以完成kernel本身的設置耍共。這些動作有的是公共的茬高,有的則是需要配置的才會執(zhí)行的.

start_kernel啟動過程分析

內核的初始化程序在start_kernel這個函數中,可以在線查看這些代碼: start_kernel。通過閱讀start_kernel代碼,可以大致了解到內核在初始化的時候,做了以下工作:1. lockdep_init():初始化內核依賴關系表致扯,初始化hash表

  1. boot_init_stack_canary():為棧增加保護機制,預防一些緩沖區(qū)溢出之類的攻擊
  2. tick_init():初始化內核時鐘系統(tǒng)
  3. boot_cpu_init():激活當前CPU
  4. setup_arch():對不同體系結構的CPU設置不同的參數当辐、選項等
  5. trap_init():初始化硬件中斷抖僵,函數中設置了很多中斷門
  6. mm_init():建立內核的內存分配器
  7. sched_init():初始化任務調度
  8. init_irq():中斷向量的初始化.... 很多初始化工作。
  9. rest_init():剩下的初始化工作缘揪,這里面其實做了很多工作.

其中幾個重要的步驟跟蹤如下:

  1. set_task_stack_end_magic(&init_task);
    在該函數中初始化了系統(tǒng)第一個task_struct結構體耍群,主要社設置了該任務的堆棧。跟蹤如下:
此處設置斷點

跟蹤進入函數:

跟蹤進入該函數內部

可以看出在此處設置了該任務的堆棧找筝。

  1. 561行上的trap_init()函數:
在561設置斷點

在該處設置斷點后執(zhí)行并步入(step) 該函數,可看待如下內容:

該函數開頭部分

在該函數中,對我們分析代碼來說最重要的是如下語句:

設置用于系統(tǒng)調用的中斷描述符

即839行上的set_system_trap_gate(SYSCALL_VECTOR, &system_call);調用.使得系統(tǒng)調用與SYSCALL_VECTOR(0x80)號中斷相關聯(lián).為以后從用戶態(tài)調用系統(tǒng)中提供的系統(tǒng)調用功能提供了途徑.

  1. 最后,該函數調用 rest_init()函數進行最后的初始化工作,包括創(chuàng)建1號進程(init),第一個內核線程等操作.
    首先我們在該函數的調用設置斷點:
在調用 rest_init 處設置斷點并執(zhí)行

進入函數,看到初始化以一個進程(init 進程)和第一個內核線程:

進入該函數
進入 kernel_thread 函數內部

該函數調用了 do_fork 進行新線程的創(chuàng)建.

創(chuàng)建第一個內核線程 kthreadd

可以看到, pid 目前是逐個累加,也可以看出內核線程確實實在 1號進程即pid 為1的進程(init)創(chuàng)建之后創(chuàng)建.
最后內核線程調用cpu_startup_entry,再在其中調用cpu_idle_loop函數進入睡眠循環(huán).節(jié)省CPU 能耗.即0號進程

在調用該函數處中斷,準備步入( step)
進入該函數
進入cpu_idle_loop()函數

總結:本實驗主要是跟蹤linux內核的啟動過程蹈垢,這里是從start_kernel到init,從而來理解linux的第一個進程及后面進程的產生過程袖裕。整個linux系統(tǒng)的所有進程是一個樹形結 構曹抬。樹根是系統(tǒng)自動構造的,樹根即是0號進程 急鳄。Linux一開始先在無進程的情況下將一直從初始化部分的代碼執(zhí)行到start_kernel谤民,然后再到其最后一個函數調用rest_init。從rest_init開始疾宏,Linux開始產生進程张足,在rest_init中,通過init_task產生pid=0的進程灾锯,即0號進程(idle進程)兢榨,它是內核狀態(tài)下的進程;在rest_init函數中顺饮,內核通過kernel_ini創(chuàng)建1號進程,它是第一個用戶態(tài)進程凌那。關于init_task(也就是idle)兼雄,當運行隊列中沒有別的就緒進程時,init_task(也就是idle)將會被調用帽蝶,它的核心是一個while(1)循環(huán)赦肋,在循環(huán)中它將會調用schedule函數以便在運行隊列中有新進程加入時切換到該新進程上。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佃乘,隨后出現(xiàn)的幾起案子囱井,更是在濱河造成了極大的恐慌,老刑警劉巖趣避,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庞呕,死亡現(xiàn)場離奇詭異,居然都是意外死亡程帕,警方通過查閱死者的電腦和手機住练,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愁拭,“玉大人讲逛,你說我怎么就攤上這事×氩海” “怎么了盏混?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惜论。 經常有香客問我括饶,道長,這世上最難降的妖魔是什么来涨? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任图焰,我火速辦了婚禮,結果婚禮上蹦掐,老公的妹妹穿的比我還像新娘技羔。我一直安慰自己,他們只是感情好卧抗,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布藤滥。 她就那樣靜靜地躺著,像睡著了一般社裆。 火紅的嫁衣襯著肌膚如雪拙绊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天泳秀,我揣著相機與錄音标沪,去河邊找鬼。 笑死嗜傅,一個胖子當著我的面吹牛金句,可吹牛的內容都是我干的。 我是一名探鬼主播吕嘀,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼违寞,長吁一口氣:“原來是場噩夢啊……” “哼贞瞒!你這毒婦竟也來了?” 一聲冷哼從身側響起趁曼,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤军浆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挡闰,有當地人在樹林里發(fā)現(xiàn)了一具尸體乒融,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年尿这,在試婚紗的時候發(fā)現(xiàn)自己被綠了簇抵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡射众,死狀恐怖碟摆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情叨橱,我是刑警寧澤典蜕,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站罗洗,受9級特大地震影響愉舔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜伙菜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一轩缤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贩绕,春花似錦火的、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娇哆,卻和暖如春湃累,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碍讨。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工治力, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垄开。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓琴许,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溉躲。 傳聞我的和親對象是個殘疾皇子榜田,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容