Linux內核移植與啟動1. Linux內核基礎知識
在動手進行linux內核移植之前,我們有必要對linux內核進行一定的了解。
Linux內核的版本號可以從源代碼的頂層目錄下的Makefile中看到,比如2.6.28.1內核的Makefile中:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 28
EXTRAVERSION = .1
Linux內核啟動過程概述
一個嵌入式Linux系統從軟件角度看可以分為四個部分:
引導加載程序(Bootloader),Linux內核,文件系統,應用程序。其中Bootloader是系統啟動或復位以後執行的第一段代碼,它主要用來初始化處理器及外設,然後調用Linux內核,linux內核在完成系統的初始化之後需要掛載某個文件系統作為根文件系統(rootfs),根文件系統是linux系統的核心組成部分,也是內核啟動時首先要掛載的就是跟文件系統。它可以作為linux系統中文件和數據的存儲區域,通常它還包括系統配置文件和運行應用程序需要的庫,保證了人和內核的信息交互。應用程序則是嵌入式系統所要達到的目標,一切的准備都是為了實現程序。若是沒有應用程序,硬件上再精良嵌入式系統都沒有實用意義。
Bootloader:在嵌入式操作系統中,BootLoader是在操作系統內核運行之前運行。可以初始化硬件設備、建立內存空間映射圖,從而將系統的軟硬件環境帶到一個合適狀態,以便為最終調用操作系統內核准備好正確的環境。Bootloader在它完成CPU和相關硬件的初始化之後,再將操作系統映像或固化的嵌入式應用程序裝在到內存中然後跳轉到操作系統所在的空間,啟動操作系統運行。它最根本的功能就是為了啟動linux內核.為了啟動內核Bootloader要依次完成
初始化RAM—
初始化串口—
檢測處理器類型—
設置Linux啟動參數—
調用LInux內核鏡像。 2.Linux 內核移植與啟動2.1
交叉編譯器:buildroot-2012.08 Bootloader:U-boot-2010.09
Target borad:FL24402.2 下載並解壓縮linux-3.0.tar.bz2源代碼
首先到 Linux Kernel 官方網站www.kernel.org下載得到linux-3.0-rc4.tar.bz2
文件,把它放到一個你有權限讀寫的文件夾,運行下面命令解壓縮並進入解壓後的文件夾:
2.3配置內核編譯參數
1.首先修改頂層目錄的Makefile文件 $ vim Makefile
這裡首要便是交叉編譯器環境變量和選擇開發平台類型
然後要將生成的zimage拷貝到當前目錄,再手動增加mkimage工具來自動把Zimage生成可執行的.bin文。
注:內核編譯之後會生成兩個文件。一個Image,一個Zimage。image為內核映像文件,而Zimage為內核映像壓縮文件。Image大約為4M,而Zimage不到2M。
2.
修改晶振頻率因為我使用的是FL2440的開發板,根據datesheet可知晶振頻率為12M。所以下一步修改晶振頻率。
$ vim arch/arm/mach-s3c2440/mach-smdk2440.c
3.
修改驅動的串口$ vim drivers/tty/serial/samsung.c
參考mini2440的.config文件作為我們的默認.config文件。改好之後再
$ Make menuconfig
打開文本窗口來選定即將要編譯的模塊,保存後會將裡面的信息保存到同時生成的.config配置文件中。
另外:make menuconfig時出來的文本窗口中的信息是通過讀取在內核源代碼目錄下的Kconfig文件來配置的。根據Makefile文件來編譯,而Makefile文件中的變量則通過.config來進行賦值操作。僅僅在Kconfig中添加選項。
4.修改MACHINE ID設備編號OK,同樣因為是做FL2440的內核,所以我們選擇三星SMDK2440這個開發板。
因為我U-boot中使用的machine id為1999,而且我使用的是s3c2440這個板子。
將mini2440和和s3c2440的machineID對調。
$ vim arch/arm/tools/mach-types
配置就緒之後
Make顯示成功
此時已經會生成一個linux-s3c2440.bin的可執行二進制文件。
5.
對nandflash進行分區$ vim arch/arm/plat-s3c24xx/common-smdk.c
注意:此時若要再進行分區就要選擇相應的文件系統。
Nandflash比較常用的有yaffs2,ubifs,cramfs以及initramfs等等。$ make
此時能編譯成功,但是生成的linux-s3c2440.bin文件依舊不能在板子上跑起來。
因為內核啟動時首先掛載的是根文件系統,我們還沒有做根文件系統給予內核支持,系統會出錯而退出啟動。
燒錄結果如下:
****內核移植過程中遇到的問題:1.SecureCRT界面開啟得太小,導致要編譯的模塊的文本窗口無法打開。
解決:-直接最大化。
2.交叉編譯器的路徑沒有設置正確。
解決:
將 /opt/buildroot-2012.08.packet/buildroot-2012.08/arm920t/usr/bin/arm-linux-
改為 /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-(自己交叉編譯器的路徑)
3.
解決:要將生成的
zimage拷貝到當前目錄,再手動增加mkimage工具來自動把Zimage生成可執行的.bin文。4.TFTP路徑沒有設置正確,路徑中包含中文名文件夾,導致無法下載到開發板。
解決:創建一個英文名文件夾,將linuxrom-s3c2440.bin文件放入,設置好TFTP路徑。
5.linuxrom-s3c2440.bin沒法轉出。
解決:將 mkimage -A arm -O linux -T kernel -C none -a 30008040 -n "Linux Kernel" -d zImage\ linuxrom-s3c2440.bin去掉“/”
即改為mkimage -A arm -O linux -T kernel -C none -a 30008040
-n "Linux Kernel" -d zImage linuxrom-s3c2440.bin