朱 黎
(陜西工業(yè)職業(yè)技術(shù)學(xué)院,陜西咸陽(yáng) 712000)
由于嵌入式產(chǎn)品的大量應(yīng)用和由于Linux具有良好的可裁剪性與可移植性,而且代碼完全公開(kāi),具有豐富的網(wǎng)絡(luò)資源及有力的技術(shù)支持和眾多的研發(fā)力量。因此,嵌入式Linux系統(tǒng)的開(kāi)發(fā)得到廣泛的重視,成為越來(lái)越多的嵌入式系統(tǒng)選擇和開(kāi)發(fā)熱點(diǎn)。一個(gè)完整的嵌入式Linux系統(tǒng)通常由由Bootload、內(nèi)核、文件系統(tǒng)3部分組成,目標(biāo)板上電后由Bootload初始化硬件,引導(dǎo)內(nèi)核和文件系統(tǒng),從而啟動(dòng)Linux。
嵌入式Linux開(kāi)發(fā)環(huán)境的搭建主要包括:編譯生成Bootloader、裁剪、配置和編譯Kernel Image和Root File System,并將它們燒寫(xiě)到Flash中。
本系統(tǒng)開(kāi)發(fā)環(huán)境是在宿主機(jī)的vmware虛擬機(jī)中安裝Linux操作系統(tǒng)實(shí)現(xiàn)的。其中Linux操作系系統(tǒng)的開(kāi)發(fā)版本為 RedHat4.0,內(nèi)核版本為 Linux2.6.24。此外,還需要在宿主機(jī)上配置IP地址并關(guān)閉防火墻、相關(guān)的網(wǎng)絡(luò)服務(wù),如NFS網(wǎng)絡(luò)文件系統(tǒng)、TFTP服務(wù)、Samba服務(wù)。而對(duì)應(yīng)的ARM開(kāi)發(fā)板通常稱為目標(biāo)板。GNU編譯器的開(kāi)發(fā)流程如圖1所示。
圖1 GNU編譯器的開(kāi)發(fā)流程
圖2 用gcc編譯程序流程
Bootloader芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段程序,其作用與PC機(jī)上的BIOS類(lèi)似。Bootloader主要是為運(yùn)行操作系統(tǒng)提供基本的運(yùn)行環(huán)境,如CPU、SDRAM、Flash、串行口等進(jìn)行初始化,也可以下載文件到系統(tǒng)板,對(duì)Flash進(jìn)行擦除與編程。
1)建立目錄并解壓u-boot源碼
2)進(jìn)入解壓后的目錄 u-boot-1.3.2,首先用 make distclean命令清除原來(lái)編譯環(huán)境依賴關(guān)系
3)配置開(kāi)發(fā)板,編譯u-boot。編譯成功后會(huì)在當(dāng)前目錄下生成u-boot二進(jìn)制文件。
4)燒寫(xiě)U-Boot
將編譯得到的u-boot.bin拷貝到PC機(jī)sjf2410-s.exe文件所在的路徑下。連接好開(kāi)發(fā)板的電源、JTAG下載線,然后打開(kāi)電源。在PC機(jī)的DOS命令提示符下,進(jìn)入u-boot.bin所在文件夾,運(yùn)行命令燒寫(xiě)u-boot。
在燒寫(xiě)中需要做一些選擇,要分別輸入三次0,開(kāi)始燒寫(xiě),燒寫(xiě)完輸入2推出。
連接好開(kāi)發(fā)板和主機(jī)之間的串口、網(wǎng)口,斷開(kāi)開(kāi)發(fā)板的JTAG下載線,重新啟動(dòng)開(kāi)發(fā)板。如果燒寫(xiě)成功,會(huì)在串口終端上出現(xiàn)如下內(nèi)容:
1)修改Makefile文件
在配置內(nèi)核之前需要修改 linux-2.6.24.2目錄下的Makefile文件,指定交叉編譯器為arm-linux-編譯器和使用ARM體系結(jié)構(gòu)。
使用vi編輯器打開(kāi)Makefile文件,作如下修改。
2)配置內(nèi)核
內(nèi)核源碼必須先進(jìn)行配置才能編譯。通常內(nèi)核的配置有以下4 中方法:make config、make xconfi、make menuconfig和make gconfig。
得到.config文件,運(yùn)行“make menuconfig”命令打開(kāi)內(nèi)核配置界面如圖3所示。設(shè)置S3C2410 Machines、Nand Flash、網(wǎng)卡、文件系統(tǒng)等相關(guān)配置信息。
圖3 內(nèi)核配置界面
1)編譯內(nèi)核映像和模塊
如果內(nèi)核已經(jīng)編譯過(guò)多次,需進(jìn)入內(nèi)核根目錄清除原先殘留的.config和.o文件。然后用make命令進(jìn)行編譯。編譯成功,在內(nèi)核源碼根目錄的arch/arm/boot下生成zImage文件。
2)生成uImage文件
使用由u-boot生成的工具mkimage,生成uImage文件。執(zhí)行腳本程序make_uImage此時(shí)會(huì)在內(nèi)核源碼根目錄下生成uImage內(nèi)核文件。
1)配置IP地址。設(shè)置宿主機(jī)即TFTP服務(wù)器端機(jī)器IP為 setenv serverip 192.168.1.12,設(shè)置 ARM 端 U-BOOT 中網(wǎng)絡(luò)設(shè)備 IP 地址 setenv ipaddr 192.168.1.13,saveenv保存設(shè)置。
2)將生成的uImage文件拷貝到tftpboot目錄下
3)下載到SDRAM。運(yùn)行tftp 0x30008000 uImage命令,將uImage文件下載到ARM開(kāi)發(fā)板的SDRAM中0x30008000開(kāi)始的空間中。
4)擦除NANDFLASH空間,寫(xiě)入Nand Flash。
重啟ARM開(kāi)發(fā)板,執(zhí)行命令“bootm”,實(shí)現(xiàn)U-BOOT引導(dǎo)內(nèi)存中的內(nèi)核。啟動(dòng)后液晶屏左上角出現(xiàn)小企鵝圖案。
Root Filesystem(根文件系統(tǒng))是ARM Linux正常運(yùn)行的必要組成部分。創(chuàng)建文件系統(tǒng)后,應(yīng)用程序?qū)and-Flash存儲(chǔ)設(shè)備的讀寫(xiě)操作就好像對(duì)MS-DOS文件系統(tǒng)的磁盤(pán)設(shè)備操作一樣。目前Linux支持多種文件系統(tǒng),主要包括Romfs、Cramfs、JFFS和 JFFS2等。
1)創(chuàng)建根文件目錄rootfs
2)使用busybox工具創(chuàng)建文件系統(tǒng)
a)將已有的busybox-1.12.2壓縮包拷貝到根目錄下并解壓
b)修改Makefile文件,支持交叉編譯
修改該目錄下Makefile文件中的ARCH和CROSS_COMPIL,指定交叉編譯器和目標(biāo)系統(tǒng),與本機(jī)的路徑一致。
c)編譯busybox
執(zhí)行命令make menuconfig進(jìn)入busybox如圖4所示配置界面設(shè)置相關(guān)選項(xiàng)并保存。
圖4 busybox的配置界面
d)用make,make install進(jìn)行編譯生成_install目錄
至此busybox工具編譯完成,生成了文件系統(tǒng)需要的相關(guān)命令和工具在_install目錄下。用戶也可以根據(jù)需要,在busybox中添加刪除相關(guān)命令和工具。
創(chuàng)建根文件系統(tǒng)的其它目錄結(jié)構(gòu),如 etc、dev、lib、mnt等,并添加相關(guān)配置文件與設(shè)備節(jié)點(diǎn)。也可直接解壓rootfs壓縮包,生成rootfs根目錄樹(shù)。
3)復(fù)制_install文件夾內(nèi)容
將“/home/uptech/rootfs/busybox-1.12.2/_install”的全部?jī)?nèi)容復(fù)制到“/home/uptech/rootfs”中。
4)使用mkcramfs工具將rootfs文件系統(tǒng)目錄制作成CRAMFS根文件系統(tǒng)映像生成root.cramfs根文件系統(tǒng)文件。
1)將生成的根文件系統(tǒng)文件root.cramfs到宿主機(jī)TFTP服務(wù)器下載目錄/tftpboot
2)配置宿主機(jī)和目標(biāo)機(jī)的網(wǎng)絡(luò)IP,啟動(dòng)ARM設(shè)備,進(jìn)入U(xiǎn)-Boot控制臺(tái)
3)下載到SDRAM
在U-BOOT中輸入boot目錄引導(dǎo)系統(tǒng)。
輸入root用戶名稱,系統(tǒng)順利引導(dǎo)運(yùn)行起來(lái)了。
本章主要設(shè)計(jì)完成系統(tǒng)設(shè)計(jì)所需要的開(kāi)發(fā)環(huán)境的搭建。首先給出了嵌入式Linux開(kāi)發(fā)環(huán)境主要過(guò)程。其中介紹了GNU編譯器和gcc編譯工具的基本結(jié)構(gòu)及gcc編譯程序的基本能流程。然后詳細(xì)的介紹了Bootloader操作模式、啟動(dòng)過(guò)程和U-Boot移植、測(cè)試。此外介紹Linux內(nèi)核的裁減、配置、編譯和燒寫(xiě),及根文件系統(tǒng)建立、編譯、配置和燒寫(xiě)過(guò)程。
[1] 高強(qiáng),鄭曉慶,陳敏.嵌入式Linux的家用無(wú)線遠(yuǎn)程監(jiān)控系統(tǒng)[J].自動(dòng)化與儀表,2010(5):47 -50.
[2] 呂盛林,林子杰,陳立定.基于ARM9的無(wú)線環(huán)境監(jiān)控系統(tǒng)的實(shí)現(xiàn)[J].信息技術(shù),2009(12):17-20.
[3] 何永琪.嵌入式Linux系統(tǒng)實(shí)用開(kāi)發(fā)[M].北京:電子工業(yè)出版社,2010:13 -24.
[4] 楊宗德.嵌入式ARM系統(tǒng)原理與實(shí)訓(xùn)開(kāi)發(fā)[M].第2版.北京:電子工業(yè)出版社,2010.
[5] 華清軟件嵌入式培訓(xùn)中心.嵌入式Linux應(yīng)用程序開(kāi)發(fā)標(biāo)準(zhǔn)教程[M].第2版.北京:人民郵電出版社,2010:109-114.
[6] 薛園園.21天學(xué)通Linux嵌入式開(kāi)發(fā)[M].北京:電子工業(yè)出版社,2010:51 -52.
[7] 楊水清,張劍,施云飛.ARM嵌入式Linux系統(tǒng)開(kāi)發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2010.
[8] 韋東山.嵌入式Linux應(yīng)用開(kāi)發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2009.
(責(zé)任編輯楊繼森)