邵帥 原創作品轉載請注明出處 《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()。

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