Linux核心3.0.54移植
開門見山
Linux是一個一體化核心(monolithic kernel)系統。“核心”指的是一個提供硬體抽象層、磁碟及檔案系統控制、多工等功能的系統軟體。Linux核心的主要模組(或元件)分以下幾個部分:儲存管理、CPU和程序管理、檔案系統、裝置管理和驅動、網路通訊,以及系統的初始化(引導)、系統呼叫等。核心由U-boot程式來啟動,因此,在移植核心之前我們需要準備的東西:
1.完成Bootloade即U-boot的移植;
2.為我們的核心移植準備好編譯環境——交叉編譯器;
3.在官網www.kernel.org下載我們的原始檔——Linux-3.0.54.tar.bz2。
注意不要下載不穩定的版本。
任務開始
1.建立一個有讀寫許可權的資料夾用來存放我們下載的原始檔,並將其解壓縮
$tar -xjf linux-3.0.54.tar.bz2
2.配置我們的核心引數
(1).修改Makefile檔案
$vim Makefile
這裡主要是選擇我們的開發平臺型別以及將我們的交叉編譯器的環境變數設定好。
這裡是將生成的zimage檔案拷貝到當前目錄,在手動新增mkimage工具來自動把Zimage生成可執行之.bin檔案。Zimage是核心的映像壓縮檔案,大小3M左右。
這裡是解釋這段程式碼含義,可忽略。
(2).修改晶振頻率
所謂晶振頻率,就是我們板子的工作頻率,晶振全稱晶體振盪器,它結合開發板的內部電路,產生時鐘頻率,板子的一切指令執行均在此基礎之上,晶振提供的時鐘頻率越高,板子的執行速度越快。我們的FL2440的開發板晶振頻率為12MHz。
$vim linux-3.0.54/arch/arm/mach-s3c2440/mach-smdk2440.c
(3).修改驅動的串列埠
$vim linux-3.0.54/drivers/tty/serial/Samsung.c
接下來我們把mini2440的.config檔案作為我們的預設.config檔案
cp arch/arm/configs/mini2440_defconfig .config
$export TERM=vt100
這裡說明TERM環境變數的型別,避免亂碼出現
$Make menuconfig
menuconfig是常用的配置工具,我們可以用它選擇要編譯進核心的模組,然後將資訊儲存在生成的.config配置檔案中,make menuconfig時出來的文字視窗中的資訊是通過讀取在核心原始碼目錄下的Kconfig檔案來配置的。根據Makefile檔案來編譯,而Makefile檔案中的變數則通過.config來進行賦值操作。僅僅在Kconfig中新增選項。
這裡新增的是s3c2440,第一個不要選,和圖片一樣即可。
(4).修改MACHINE ID裝置編號
我們做的FL2440核心與三星的SMDK2440一樣,我們U-boot使用裝置號為1999,板子為s3c2440,所以將mini2440和s3c2440的裝置號對換(mini2440即採用三星的s3c2440為處理器)
$vim linux-3.0.54/arch/arm/tools/mach-types
配置完成後就可以編譯了:
$make
過程省略......................................................
編譯過程中的錯誤請自行解決...................................................
成功以後會生成Linux-s3c2440.bin的可執行二進位制檔案。
(5)對我們的硬碟(nandflash)進行分割槽
$vim linux-3.0.54/arch/arm/plat-s3c24xx/common-smdk.c
這裡說明一下,我們板子上的nandflash為256M,我們將它分成5個區,分別是
bootloader——1M,核心15M,根檔案系統——40M,app——100M,data——100M,
分割槽完畢以後make
$make
編譯成功以後我們需要為核心新增根檔案系統支援,因為核心啟動首先掛載的是根檔案系統。這裡製作的是簡單的initramfs檔案系統作為根檔案系統,其他的檔案系統大家可以自己瞭解製作也可以參考我的後續文章。
export TERM=vt100
$Make menuconfig
這裡是選擇支援initramfs檔案系統,還要填寫其所處位置,我的是/opt/rootfs/,這個路徑在後續製作根檔案系統的時候會建立起來。
選擇完以後重新make,我們的核心即可在開發板中啟動。