IT业行者,行者无疆
分类: LINUX
2011-04-29 10:41:04
Kernel 是作業系統的核心,作業系統所提供的各項功能就是包含在 Kernel 中。本次實驗將介紹如何製作作業系統的核心部份,內容包括了:介紹 Linux Kernel、介紹製作符合自己需求的 kernel ,並將 Linux 放在不同的 platform 上執行。
kernel 是作業系統的核心元件,負責處理應用程式和硬體之間的溝通。關於 kernel 的詳細介紹可以參考 wikipedia 。
Linux kernel 是 Linux 作業系統的 kernel,目前的最新版本是 2.6.*。關於 Linux kernel 的詳細介紹可參考 wikipedia 。
在 kernel 中,為符合不同計算機結構的需求,可能需要對 kernel source 作一些調整,如調整 memory mapped I/O 或增加專屬於該結構的特殊功能。patch 的目的就在將想要更改的程式原始碼自動更新在舊原始碼上。關於 patch 的詳細介紹可參考 wikipedia 。
patch patch in unix |
Linux kernel 的檔案庫是在 ,目前所有的 linux kernel 版本都可以在這裡下載。本次實驗中使用的是 linux kernel 2.6.18.1,可在終端機上直接用 wget 下載。
# 下載 wget # 解壓縮 tar jvxf linux-2.6.18.1.tar.bz2 # 切換到 linux kernel 目錄 cd linux-2.6.18.1
編譯 kernel 的步驟和編譯一般的應用程式差不多,都需要經過 make configure、make的過程。以下指令都要在 kernel source的根目錄執行。
make mrproper (清理原始檔)
make mrproper 會將所有編譯出來的檔案(包含 configure )都清除,這個動作可以確保這次編譯的kernel不會被之前的設定所影響。
make menuconfig ARCH=arm (設定linux kernel)
configure 是將 linux kernel 調整成適合目標系統使用的手段,在本次實驗中,我們先下載已經設定好的 .config 檔,接著再用 menuconfig 的方式瀏覽 .config 的內容。
# 下載 config 檔 wget在下載完成後,鍵入 make menuconfig ARCH=arm ,即可進入圖形化介面的設定模式。
make menuconfig 是圖性化介面的 configure 模式,可以依照預先設定好的分類來尋找需要調整的項目。在鍵入 make menuconfig 後,就可以看到圖性化的選單。首先,將游標移到選單最下方的「Load an Alternate Configuration File」,把下載下來的 configure 檔複製到 kernel source 中;這份新的 config 檔將原本的 kernel 調整為一個適合用 ARM 來執行的小型 kernel、使用 ramdisk、取消 module 的使用,並且盡量減少記憶體的消耗。
如果想要查看或是調整目前的設定,可以用方向鍵、Enter來進出各個項目;以下介紹在 menuconfig 的介面中,一些比較特殊的符號:
[ ]、<>、[*]、
在每個選項的左方都可以看到上述的其中一個符號,這四個符號代表該選項目前的狀態。
「 [ ] 」(excludes)表示該選項沒有被選取,編譯後的 kernel 將不會有此功能。
「 < > 」(module capable)表示該選項沒有被選取,而且是可以被當做是 module,可以在開機之後另外載入的。
「 [*] 」(built-in)表示該選項有被選取,編譯後的 kernel 包含此功能,而且該功能會被編入 kernel image 中,這意味著在 kernel 被載入時該功能就已經存在,有些功能是一定要在 kernel 被載入時就存在的,例如讀取 filesystem,因為 kernel 無法從它認不出的 filesystem 裡讀取檔案。雖然將各能選成內建可以將整個 kernel 的功能包成一個 kernel image 檔,但它也會造成執行時一些不必要的記憶體以及初始化時間的浪費。
「
」(module)表示該選項有被選取,而且是被編譯成 module 的形式,它會存放在 filesystem中,並在 kernel 被載入後才動態地載入。編譯成 module 的優點是減少 kernel image 的空間、加快開機時間,以及方便開發 kernel 功能,因為 module 是在開機後才被載入,每次修改該功能時只需要重新編譯並載入 module ,而不需要重新編譯整個 kernel 並且重新開機。 --->
「--->」表示該選項是一個分類,他底下還有其他的項目可以選擇。在調整完 configure 檔之後,按下方向鍵的「->」,將選項切換到
,就可以選擇存檔並且離開。
在編譯完成之後,可以在 arch/arm/boot/ 底下發現編譯完成的 kernel image -- zImage。若編譯失敗,或想重新編譯,可以打 make clean 來清除所有除了 config 以外的編譯出來的檔案。
我們可以用 QEMU 來測試新編的 kernel image 是否能夠執行。
在這裡要找一個確定可以用而且符合此 kernel 相關設定的 file system,QEMU官方網站上的 arm-test disk image 可以符合這項需求。如果在實驗一中已經有下載過 arm-test disk image,可以直接使用而不需另外下載下載方法如下:
# 下載 disk image wget # 解壓縮 tar zxf arm-test-0.2.tar.gz
若在終端機鍵入下列指令後,能夠看到登入畫面,並用root登入,則代表 kernel 編譯成功
/arm-softmmu/qemu-system-arm -kernel \ -initrd /arm_root.img -nographic -append "console=ttyAMA0"
Note