Kernel啓動流程源碼解析 12 總結


kernel鏈接腳本vmlinux.lds
在arm64芯片架構上是以arch/arm64/kernel/vmlinux.lds.S編譯生成的。

  1. 從中可以看到kernel的入口點是stext,這是一個彙編函數。
  2. 從stext開始kernel將會完成一系列通過彙編語言實現芯片級的初始化工作,並以靜態定義的方式創建kernel的第一個kernel進程init_task,即0號進程。
  3. 然後跳轉到kernel的第一個c語言函數start_kernel完成後續十分繁雜的kernel初始化工作,這裏我主要關注了setup_arch,mm_init,sched_init,init_IRQ以及最爲關鍵的rest_init等幾個函數。
  4. 然後在rest_init中創建了kernel的第二個kernel進程kernel_init(1號進程)和第二個kernel進程kthreadd(2號進程),對於驅動工程來說,需要關注下kernel_init調用的do_basic_setup函數,其完成了系統驅動初始化工作。
  5. 最後kernel_init通過調用run_init_process("/init”),開始執行init程序,並從kernel進程轉化爲第一個用戶進程。




需要說明下,對於kernel的啓動流程,我還處於學習階段,並且由於kernel的複雜程度,認識和理解會顯得膚淺和不成熟,不過這個過程是無法跳過的,因此隨着後續對kernel認識和理解的提升,會時不時的回來對這幾篇博客進行更新和完善。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章