Compile Linux kernel

Lab 2 編譯 kernel

http://opencsl.openfoundry.org/Lab02_kernel.rst.html

Kernel 是作業系統的核心,作業系統所提供的各項功能就是包含在 Kernel 中。本次實驗將介紹如何製作作業系統的核心部份,內容包括了:介紹 Linux Kernel、介紹製作符合自己需求的 kernel ,並將 Linux 放在不同的 platform 上執行。

1. 什麼是 Linux kernel

1.1 Kernel 結構

kernel 是作業系統的核心元件,負責處理應用程式和硬體之間的溝通。關於 kernel 的詳細介紹可以參考 wikipedia [1]

[1]http://en.wikipedia.org/wiki/Kernel_%28computer_science%29

1.2 Linux kernel 簡介

Linux kernel 是 Linux 作業系統的 kernel,目前的最新版本是 2.6.*。關於 Linux kernel 的詳細介紹可參考 wikipedia [2]

[2]http://en.wikipedia.org/wiki/Linux_kernel

1.3 Patch

在 kernel 中,為符合不同計算機結構的需求,可能需要對 kernel source 作一些調整,如調整 memory mapped I/O 或增加專屬於該結構的特殊功能。patch 的目的就在將想要更改的程式原始碼自動更新在舊原始碼上。關於 patch 的詳細介紹可參考 wikipedia [3]

[3]

patch http://en.wikipedia.org/wiki/Patch_%28computing%29

patch in unix http://en.wikipedia.org/wiki/Patch_%28Unix%29

2. 編譯 kernel

2.1 下載 kernel 原始檔

Linux kernel 的檔案庫是在 http://www.kernel.org/ ,目前所有的 linux kernel 版本都可以在這裡下載。本次實驗中使用的是 linux kernel 2.6.18.1,可在終端機上直接用 wget 下載。

# 下載
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2
# 解壓縮
tar jvxf linux-2.6.18.1.tar.bz2
# 切換到 linux kernel 目錄
cd linux-2.6.18.1

2.2 編譯步驟

編譯 kernel 的步驟和編譯一般的應用程式差不多,都需要經過 make configure、make的過程。以下指令都要在 kernel source的根目錄執行。

  1. make mrproper (清理原始檔)

    make mrproper 會將所有編譯出來的檔案(包含 configure )都清除,這個動作可以確保這次編譯的kernel不會被之前的設定所影響。

  2. make menuconfig ARCH=arm (設定linux kernel)

    configure 是將 linux kernel 調整成適合目標系統使用的手段,在本次實驗中,我們先下載已經設定好的 .config 檔,接著再用 menuconfig 的方式瀏覽 .config 的內容。

# 下載 config 檔
wget http://opencsl.openfoundry.org/setting/linux-2.6.18.config

在下載完成後,鍵入 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 的介面中,一些比較特殊的符號:

  1. [ ]、<>、[*]、<M>

    在每個選項的左方都可以看到上述的其中一個符號,這四個符號代表該選項目前的狀態。

    「 [ ] 」(excludes)表示該選項沒有被選取,編譯後的 kernel 將不會有此功能。

    「 < > 」(module capable)表示該選項沒有被選取,而且是可以被當做是 module,可以在開機之後另外載入的。

    「 [*] 」(built-in)表示該選項有被選取,編譯後的 kernel 包含此功能,而且該功能會被編入 kernel image 中,這意味著在 kernel 被載入時該功能就已經存在,有些功能是一定要在 kernel 被載入時就存在的,例如讀取 filesystem,因為 kernel 無法從它認不出的 filesystem 裡讀取檔案。雖然將各能選成內建可以將整個 kernel 的功能包成一個 kernel image 檔,但它也會造成執行時一些不必要的記憶體以及初始化時間的浪費。

    「 <M> 」(module)表示該選項有被選取,而且是被編譯成 module 的形式,它會存放在 filesystem中,並在 kernel 被載入後才動態地載入。編譯成 module 的優點是減少 kernel image 的空間、加快開機時間,以及方便開發 kernel 功能,因為 module 是在開機後才被載入,每次修改該功能時只需要重新編譯並載入 module ,而不需要重新編譯整個 kernel 並且重新開機。

  2. --->

「--->」表示該選項是一個分類,他底下還有其他的項目可以選擇。

在調整完 configure 檔之後,按下方向鍵的「->」,將選項切換到<Exit>,就可以選擇存檔並且離開。

  1. make ARCH=arm CROSS_COMPILE=arm-linux-uclibc- (編譯)
在編譯完成之後,可以在 arch/arm/boot/ 底下發現編譯完成的 kernel image -- zImage。若編譯失敗,或想重新編譯,可以打 make clean 來清除所有除了 config 以外的編譯出來的檔案。

3. 執行新的 kernel

我們可以用 QEMU 來測試新編的 kernel image 是否能夠執行。

3.1 下載 file system

在這裡要找一個確定可以用而且符合此 kernel 相關設定的 file system,QEMU官方網站上的 arm-test disk image 可以符合這項需求。如果在實驗一中已經有下載過 arm-test disk image,可以直接使用而不需另外下載下載方法如下:

# 下載 disk image
wget http://bellard.org/qemu/arm-test-0.2.tar.gz
# 解壓縮
tar zxf arm-test-0.2.tar.gz

3.2 用QEMU執行

若在終端機鍵入下列指令後,能夠看到登入畫面,並用root登入,則代表 kernel 編譯成功

<QEMU>/arm-softmmu/qemu-system-arm -kernel <KERNEL> /
      -initrd <ARM_TEST>/arm_root.img -nographic -append "console=ttyAMA0"

Note

<QEMU> = qemu 的根目錄 (如 qemu-0.9.1/ )

<KERNEL> = kernel image 的位置 (如 linux-2.6.18.1/arch/arm/boot/zImage)

<ARM_TEST> = arm-test 的位置

5. 關於本文件

本文件以 reStructuredText 格式編撰,並可使用 docutils 工具轉換成 HTML 或 LaTeX 各類格式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值