讀書筆記《Building embedded linux system》Chapter 5 核心思考

來源:互聯網
上載者:User
 

通用的linux提供一個已經編譯好的kernel,但是在嵌入式作業系統中,這種方式比較少用。我們將提供一個儘可能簡單的kernel configuration,去除我們不需要的功能。我們首先需要選擇linux的kernel。

我們可以在http://www.kernel.org/中得到官方(official,也成為upstream或者 mainline)的linux核心版本,他是Torvalds以及全球的其他自願者提供。雖然2.4的版本仍在很多裝置上使用,如果是新的開發應基於 2.6的版本。這些版本通常更關心工作在x86的desktop和server,但是也不會忽略嵌入式裝置。嵌入式作業系統和CPU的結構有關,例如 ARM結果,ARM的開發人員根據官方的版本,增加他們特定的patch,這些補丁將反饋給Linus,進入官方的版本中。我們選擇linux kernel可能是網站社區,有人或者一群人來維護你所選擇的架構,例如ARM、PowerPC。如果我們對kernel code有改動,應儘快地反饋,使得你的程式可以在下一版本中沿用,這同時也受到了GPL的要求。

我們也可以從第三方廠家那裡得到kernel,雖然是基於上遊版本,但是包括了很多的patch提供特別的功能,修訂bug,已經有不少修改,它上遊的版本可能有很多的不同。這種有點類似我們使用moblin封裝的kernel。

當我們選擇kernel後,我們對kernel進行configuration,選擇所需的部分。對於嵌入式架構,包括下面的選擇:Code maturity level options, General setup, Loadable module support, Block layer, Networking, Device drivers, Filesystems, Kernel hacking, Security options, Cryptographic options, Library routines。第一步是選擇正確的CPU架構。我們進行配置,可以使用make config, make oldconfig, make menuconfig和make xconfig,都可以在source code那裡產生一個.config檔案。一般使用menuconfig,對於xconfig某些架構,例如PPC,菜單會有些問題。在上一章講過使用 cross plateform toolchain的情況,命令如下:$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig。

在makefile中有一個參數為EXTRAVERSION,例如設定為-rmk1,則kernel為2.6.29-rmk1,可以用來提供不同版本的區別,例如增加某些模組等等。

接著就是編譯,包括kernel image和kernel modules。編譯kernel的例子為make ARCH=arm CROSS_COMPILE=arm-linux- zImage ,zImage表示使用gzip的壓縮方式,對於x86,還可以是bzImage(表示big zImage,和bz2的壓縮沒有關係),這一步驟的順利進行用於檢驗我們對kernel配置是否正確,也可以檢驗cross-development工具鏈環境是否正確。編譯好之後,可以編譯核心模組,例如:make ARCH=arm CROSS_COMPILE=arm-linux- modules。如果我們希望刪除之前處理的內容,包括設定檔,編譯的.o檔案和kernel img,可以使用 make ARCH=arm CROSS_COMPILE=arm-linux- distclean 命令。在使用這個命令之前,請儲存好設定檔img等內容。

編譯之後是安裝。這個將在第6章和第9張介紹。對於管理多個kernel img,每個包括vmlinux,System.map,.config以及arch/your_arch/boot/下的zImage或者 bzImage。有些架構,例如PPC,有很多boot目錄,所以img不一定為arch/your_arch/boot/zImage,可以是arch /ppc/images/vmlinux.gz。建議我們將他們都存放在$(PRJROOT)/images/的路徑下。核心模組的安裝,包含在 makefile中,預設的將安裝在/lib/modules目錄。但是我們使用的是cross的環境,不是要更新原生核心模組,這點必須要注意。例子:$ make ARCH=arm CROSS_COMPILE=arm-linux- INSTALL_MOD_PATH=${PRJROOT}/images/modules-2.6.20 modules_install 。之後,我們將建立在模組運行中模組所需要的依賴,使用depmod,但是這個命令不使用與cross的環境,我們將從busybox網站中下載 depmod.pl來完成。一些操作的驗證,將在我們下一步的實驗中進行。

核心錯誤的一個常見情況的是kernel panic。當系統擷取一個嚴重錯誤的時候(例如root檔案系統位置缺失),他將停止所有的進程,並產生一個kernelpanic訊息。對panic 的恢複是系統重啟,可以在kernel的boot參數中設定panic=1(1秒後重啟)。但是對於實際的運行環境,有時重啟是不足夠的,需要提醒操作者緊急情況的出現,換句話說我們需要重新定義panic出現後的處理方式。這個在kernel/panic.c中定義,可以另外改寫。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.