一、為什麼要學習核心?
有些人要學習核心,而有些人則可以不學習它。你如果以後要從事系統研發或驅動開發的話,就要學習核心。
剛剛接觸核心,主要學習核心的介面函數。不要深入的去讀核心,因為你讀也讀不懂,核心代碼龐大如野獸一般不可駕馭。
學習核心主要掌握層次學習法,即從頭開始學習,一環緊扣一環。
核心學習的四步學習法:1、核心理論學習-概念與函數原型2、範常式序分析3、思維導圖設計4、親自編寫代碼
二、linux核心簡介
1、linux體繫結構
分為兩部分:使用者空間和核心空間
2、linux為什麼要分為使用者空間和核心空間
現代CPU通常實現了不同的工作模式,以ARM為例,實現了7中工作模式。X86實現了4中不同的層級:Ring0-Ring3. Ring0下可以執行特權指令,可以訪問IO裝置等,在Ring3則有很多限制。linux系統利用CPU的這一特性,使用了其中兩個層級分別運行linux核心與應用程式,這樣使作業系統本身得到充分的保護。例如:如果使用X86,使用者代碼運行在Ring3,核心代碼運行在Ring0.核心空間與使用者空間是程式執行的兩種不同狀態,通過系統調用和硬體中斷能夠完成從使用者空間到核心空間的轉移。
3.linux的核心構架
系統調用介面
SCI層為使用者空間提供了一套標準的系統調用函數來訪問Linux核心,搭起了使用者空間到核心空間的橋樑。
進程管理(PM)是建立進程,停止進程,並控制它們之間的通訊。進程管理還包括控制活動進程如何共用CPU,即進程調度。
記憶體管理(MM)的主要作用是控制多個進程安全地共用記憶體地區。
網路通訊協定棧(Network Stack)為linux提供了豐富的網路通訊協定實現。
虛擬檔案系統(VFS)隱藏各個檔案系統的具體細節,為檔案操作提供統一的介面。
裝置驅動(DD):linux核心中有大量代碼都在裝置驅動程式中,它們控制特定的硬體裝置。
三、linux核心原始碼結構
1、下載原始碼地址www.kernel.org
2、linux核心原始碼採用樹形結構進行組織,非常合理地把功能相關的檔案都放在同一個子目錄下,使得程式更具可讀性。
arch目錄:arch是architecture的縮寫。核心所支援的每種CPU體系,在該目錄下都有對應的子目錄。每個cpu的子目錄,又進一步分解為boot,mm,kernel等子目錄,分別包含控制系統引導,記憶體管理,系統調用等。/* X86英特爾cpu與之相相容體繫結構的子目錄:boot 引導程式compressed核心解壓縮 tools產生壓縮核心映像的程式 kernel相關核心特性實現方式,如訊號處理、時鐘處理 lib 硬體相關工具函數*/
documentation核心文檔
drivers裝置驅動文檔
include核心所需要的標頭檔。與平台無關的標頭檔在include/linux子目錄下,與平台有關的標頭檔則放在相應的子目錄中。
fs目錄存放各種檔案系統的實現代碼。每個子目錄對應一種檔案系統的實現,公用的來源程式用於實現虛擬檔案系統vfs
"|--devpts是/dev/pts虛擬檔案系統
||--ext2是第二擴充檔案系統
||--fat是MS的fat32檔案系統
||--isofs 是IsO9660光碟片cd-rom上的檔案系統
net是網路通訊協定的實現代碼
||--802 802無線通訊協議核心支援代碼
||--appletalk 與蘋果系統連網的協議
||--ax25 AX25無線INTERNET協議
||--bridge 橋接裝置
||--ipv4 IP協議族V4版32位定址模式
||--ipv6 IP協議族V6版
四、linux核心的配置和編譯
代碼是如何轉化為燒寫或安裝到硬體平台中的系統映像檔案的?
1、為什麼要配置核心
選出需要的,去掉不要的!1、硬體的需求2、軟體的需求
下載核心後要在linux中解壓縮,不要在windows下解壓縮因為windows下不區分大小寫,而linux作業系統區分大小寫。
進入核心的檔案下:
2、核心的配置:
make config:基於文字模式的互動式配置
make menuconfig:基於文字模式的菜單型配置
<*>檔案經過編譯由.c檔案到.o檔案,最後連結壓縮為核心鏡像,它存放在記憶體。
核心模組,同上經過編譯後會把.o檔案安裝到硬碟。
< >表示不選擇該功能
配置結果檔案是隱藏檔案,可以用ls -a 在核心檔案下查看.config version
上面介紹的是一種方法,不過作為初學者我們往往是在一個已有的設定檔基礎上,通過修改得到新的設定檔,linux核心提供了一系列可供參考的核心設定檔,位於Arch/cpu/configs
接下來,我們利用虛擬機器上的linux系統的設定檔來建立自己的升級版核心,並在虛擬機器上運行該核心。
圖:
3、編譯核心(編譯核心、編譯核心模組、製作ramdisk)
3.1、編譯核心
make zImage只能編譯小於512K的核心
make bzImage我們一般會使用這種方法編譯核心
如需擷取詳細編譯資訊,可使用:
make zImage V=1
make bzImage V=1
編譯好的核心位於arch/cpu/boot/目錄下***
3.2編譯核心模組
make modules 編譯核心模組
make modules_install 將編譯好的核心模組,從核心原始碼目錄複寫到/lib/modules下**,為打包做好準備
經過第一步編譯後,散落在各個檔案下的.ko檔案為記憶體模組。需要集中移動到/lib/modules這個就由make modules_install來完成
3.3製作init ramdisk
方法:mkinitrd initrd-$version $version
例如:mkinitrd initrd-2.6.32 2.6.32
通過uname -r 獲得正在啟動並執行核心版本
*$version可以通過查詢/lib/modules下的目錄得到
4、安裝核心
1、cp arch/x86/boot/bzImage
/boot/vmlinuz-$version
2、cp initrd-$version /boot/
3、修改/etc/grub.conf的後四行
5、清理核心
make clean 清理編譯核心生產的.o檔案
make distclean 清理編譯核心生產的.o檔案和.config $version
記憶幾個命令
rpm -qa | grep kernel 找到核心包資訊
rpm -e kernel-核心包名