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