基于AT91RM9200的ARM Linux的移植方法
標準Linux內核相對于資源受限的嵌入式系統來說是過于龐大,整個代碼分布如圖5所示,因此要將其移植到嵌入式系統上,就需要將Linux內核根據目標平臺的情況進行剪裁、配置,該目標板的主要硬件資源如圖6所示。和ARM體系結構相關的代碼都放在arch/arm/以及include/asm-arm/目錄下,將linux移植到ARM平臺上,主要修改這兩個目錄下的代碼。要想使linux內核應用于自己的ARM平臺AT91RM9200上,必須對內核的源代碼做一定的修改,主要修改部分如下:(1) 修改根目錄下的Makefile文件,確認ARCH和CROSS_COMPILE的定義:ARCH :=arm; CROSS_COMPILE :=arm-linux- (2)修改arch目錄下的Makefile文件,根據自己的電路設置TEXTADDR變量,TEXTADDR決定內核起始運行地址,即 image.ram應下載的地址。(3)修改arch目錄下的config.in 文件,添加CONFIG_ARCH_AT91RM9200自選項,config文件決定了menuconfig菜單的內容,把使用的平臺加在需要的地方,這樣在配置linux內核時就能夠選擇是否支你的平臺了。
(4)修改arch/arm/boot目錄下的Makefile文件,根據自己的電路設置ZTEXTADDR和ZRELADDR, ZTEXTADDR和ZRELADDR分別是自解壓代碼的起始地址和內核解壓后代碼輸出起始地址。(5)修改arch/arm/boot /compressed目錄下的Makefile文件,加入head-at91rm9200.S (6)修改arch/arm/kernel目錄下的Makefile文件,增加AT91RM9200的支持,同時在 debug-armv.S中加入關閉全部外圍設備,保證系統正常運行的代碼,在entry-armv.S中加入關于CPU中斷處理部分的代碼。(7)修改 arch/arm目錄下的mm-armv.c文件,將init_maps->bufferable=0改為init_maps-> bufferable=1;
當然,一些大的芯片開發商在發行芯片的同時,針對自己芯片的體系結構對linux內核作了一些補丁。實驗中使用的是針對AT91RM9200體系結構的補丁patch-2.4.19-rmk7給標準內核源代碼打上補丁后,該內核就可應用于AT91RM9200了,這樣可以大大減少開發的工作量。
移植之后要做的工作就是編譯內核,要想編譯適合自己工程中需要的內核,首先要對內核進行配置,常用的配置命令有:make config;make oldconfig;make menuconfig;make xconfig;make defconfig;Linux內核包允許用戶對其各類功能逐項配置,在配置時, 大部分選項可以使用其缺省值, 只有小部分需要根據用戶不同需要選擇。選擇的原則是將與內核其它部分關系較遠部分且不經常使用的部分功能代碼編譯成為可加載模塊, 有利于減小內核的長度, 減小內核消耗的內存,不需要的功能就不要選, 與內核緊密且經常使用的部分功能代碼直接編譯到內核中。主要是進行以下幾項配置: (1)選擇處理器類型;(2)選擇板級支持;(3)選擇對RAMDISK支持、對設備驅動的支持以及對文件系統的支持。在配置工作完成后, 就可以進行內核編譯。
編譯內核有壓縮方式和非壓縮兩種方式。非壓縮方式使用make vmlinux來編譯內核,或者直接運行make命令。壓縮方式用make bzImage來編譯內核。編譯成功后會在arch/arm/boot目錄中生成內核的鏡像,此鏡像下載到flash中就可以通過bootloader引導。具體的編譯步驟如下:(1) 進入打上補丁修改好的內核源代碼目錄下,執行make mrproper;make clean這兩條指令,將源代碼清理干凈(防止以前編譯產生的“垃圾”干擾)。(2)執行make at91rm9200dk_config,使源代碼按照AT91RM9200體系結構來配置。 (3)執行make o1dconfig(保存原編譯配置)(4)執行make menuconfig進入內核編譯前配置界面,進行配置。(5)執行make dep聲稱編譯要用的依賴文件。(6)執行make zImage生成內核鏡像。
3.3 文件系統的移植
linux采用文件系統組織系統中的文件和設備,為設備和用戶程序提供統一接口。linux要啟動起來還需要有根文件系統。根文件系統的作用是存放各種工具(如Linux命令)、應用程序、必需的鏈接庫等等。通常用busybox來制作根文件系統,在busybox中包含一百多種Linux上標準的工具程序, 而這些工具程序僅需幾百k空間。busybox使用非常方便, 只要建立一個符號連接即可, 用戶可以通過配置Config.h 和Makefile文件來定制busybox。將busybox復制到bin目錄中,分別使用ln-s 建立每一個命令的符號連接。但應該注意的是busybox需要glibc支持(如果使用靜態連接則不需要glibc 庫文件),因此還需要將運行busybox所需的庫文件copy到lib目錄中, 并建立符號連接。到此為止, ARM Linux 的根文件系統就已經建立起來了。
ARM Linux采用RAMDISK的方式來裝載根文件系統,所以在運行內核之前,需要先制作RAMDISK,將必須的文件和設備加人到RAMDISK中。內核啟動后,會從指定地址去讀取根文件系統,這里我們使用RAMDISK在內存中虛擬一個磁盤,具體方法如下:
(1)首先創建一個2048k的虛擬磁盤,文件名為initrd.img:# dd if= dev/zero of=initrd.img bs= lk count= 2048 (2)將該虛擬磁盤文件格式化成Ext2格式:# mkfs ext2 -c initrd.img這就生成了一個支持Ext2文件系統的ramdisk (3)mount這個文件系統到/tmp下,# mount -o loop -t ext2 initrd.img /tmp (4)向/tmp中添加linux啟動必須的文件和設備。 # cd /tmp; # mkdir bin dev etc lib mnt proc sbin sys usr 以上這幾個程序和設備是啟動Linux必須的,這樣得到的ramdisk大約400k (5)創建設備節點,添加相應的程序,將已經訂制好的一個文件系統全部復制過來。# cp –a myfs/* /tmp (6)壓縮映像,把loop設備卸載下來,然后用gzip命令把映像壓縮一下。# umount /tmp ; #gzip –best –c initrd.img > initrd.img.gz現在我們就得到了一個壓縮的RAMDISK映像initrd.img.gz制作好了。
評論