第一步是挑選核心,看是要使用哪個版本,包含考慮到硬體的考量,畢竟核心是對硬體提供了好一些driver,以及提供了各種記憶體管理、排程等功能
編譯核心的過程大致上分成幾個
- 設定congfigure
- 依照平台編譯
- 編譯模組 (modules)
- 安裝核心
- 安裝模組
- 測試核心
編譯的時候需要先設定configure
- make config : 依次要求使用者設定
- make oldconfig : 載入舊的設定檔案
- make menuconfig : 使用curses建構的window設定
- make xconfig : 使用x-win
除了第二個,基本上另外三個是一樣的,但是推薦使用make menuconfig,因為config在設定時候太麻煩,xconfig則需要x-win,且效果未必比menuconfig好
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
ARCH指定CPU,CROSS_COMPILE則是toolchain的名稱,千萬別傻傻跟我一樣打成CROSS-COMPILER,這樣會發稱慘案,請參考我之前編譯busybox的時候
另外作者提到一個重要的變數EXTRAVERSION,其實就是字面上的extra-version,嵌入式系統有時候會需要用上自己特殊的設定,這個變數指定最後的postfix,讓人辨別編譯出來的版本如2.6.20-motor-diff
編譯核心相對應單純
make ARCH=arm CROSS_COMPILE=arm-linux- zImage
系統會產生出vmlinux檔案,這是尚未壓縮的,zImage是使用bizp2壓縮過的,bzImage則是讓產生的壓縮檔案格式允許超出512KB,對應於硬體的限制
編譯模組也是蠻單純的
make ARCH=arm CROSS_COMPILE=arm-linux- modules
如果需要清除之前設定
make ARCH=arm CROSS_COMPILE=arm-linux- distclean
安裝核心與安裝模組
安裝核心比較單純,只要拷貝四個檔案vmlinux、System.map 、設定檔案(.config)跟bzImage/zImage,他們會位在arch/arm/boot/目錄底下。模組要小心處理,不能安裝到host機器中,不然可能會有危險
make ARCH=arm CROSS_COMPILE=arm-linux- INSTALL_MOD_PATH=${PROJROOT}/images/modules-2.6.20 modules_install
將module放到第四章提到的相對應目錄內
最後就是測試的部分,作者也沒給出太多建議,不過倒是有提到一個有趣的議題就是kernel panic的處理函式panic(),有些機器可以直接重新開機,有些則必須額外處理,相對應於應用跟規劃,例如火災的感知器如果有異狀,產生kernel panic,我想馬上產生一個警報(即使是假警報)也好過重新開機,因為重新開機有可能在當機,延誤了火災的救援
沒有留言:
張貼留言