天天看點

從start_kernel到init 

邵帥 原創作品轉載請注明出處 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

檔案夾架構

arch:支援不同的CPU的源代碼,其中的關鍵目錄包括:Documentation、drivers、firewall、fs、include等

documentation:文檔目錄

fs:檔案系統

init:核心啟動相關的代碼main.c、Makefile等基本都在該目錄中。(main.c中的start_ kernel函數是Linux核心啟動的起點,即初始化核心的起點)

kernel:Linux核心核心代碼在kernel目錄中。

lib:公用的庫檔案 mm:記憶體管理的代碼 scripts:與腳本相關的代碼

security:與安全相關的代碼

sound目錄:與聲音相關的代碼

tools目錄:與工具相關的代碼

net:與網絡相關的代碼

readme:介紹了什麼是Linux,Linux能夠在哪些硬體上運作,如何安裝核心源代碼等

調試核心     

       使用實驗樓,用gdb進行跟蹤調試核心,按照老師給的指令,首先我把斷點打在start_kernel()。

從start_kernel到init 

       在這裡BootLoader開始進行系統初始化,然後就到start_kernel()這裡,在這裡開始使用C語言實作全部功能。在start_kernel()函數中,将系統需要的功能進行初始化,例如RCU,時鐘,哈希表等等。最後,調用了rest_init(),進行接下來的初始化。然後我把斷點打在rest_init()函數處。

從start_kernel到init 

       可以看到顯示的是start_kernel()中各種初始化資訊,在rest_init()中調用kernel_thread()函數,啟動核心線程,在之後的schedule()函數idle程序釋放占用的cpu,把cpu給更需要的程序,最後在調用cpu_idle(),讓cpu繼續進入idle狀态,idle程序像一個大循環,把空閑的cpu占用,配置設定給idle程序,把空閑程序排程給需要的程序。

         關鍵在kernel_thread()函數,這個函數中對裝置驅動進行初始化,并且最後用init_post()進入使用者空間的初始化程序,在init_post()函數中,核心進行最後的初始化,将之前的init函數和資料舍棄,釋放記憶體,給其他程序用,最後調用consle,整個初始化結束。

總結

         整個核心初始化一步扣着一步,代碼十分簡潔幹淨,令人不禁頂禮膜拜。Linux大法好!

繼續閱讀