Linux uClinux建立開發(fā)環(huán)境編譯內(nèi)核
Linux uClinux對(duì)于電腦使用的玩家的常用軟件,然后我就學(xué)習(xí)及深入的研究Linux uClinux,在這里和大家一起探討Linux uClinux的使用方法,希望對(duì)大家有用。作為L(zhǎng)inux uClinux系統(tǒng)的移植和開發(fā)的主機(jī)最好使用Linux操作系統(tǒng),如果選擇Windows平臺(tái)作為開發(fā)平臺(tái)則需要Cygwin軟件包的支持。在這里我們選用的開發(fā)平臺(tái)是Fedora Core 2,內(nèi)核版本為2.4.x。
1.建立開發(fā)環(huán)境
在進(jìn)行Linux uClinux的移植和開發(fā)之前,我們需要建立系統(tǒng)的交叉編譯環(huán)境,因?yàn)樽鰹橹鳈C(jī)我們使用的是IA32體系結(jié)構(gòu)的處理器,而開發(fā)板我們才用的是ARM體系結(jié)構(gòu)的處理器。ARM平臺(tái)的交叉編譯工具可以從Linux uClinux的官方網(wǎng)站獲得(www.Linux uClinux.org)。
在這里我們采用的是arm-elf-tools-20030314.sh,該文件是一個(gè)自解壓文件,可以直接執(zhí)行程序安裝。#./arm-elf-tools-20030314.sh如果不能執(zhí)行該文件,則需要修改一下文件的可執(zhí)行屬性#chmod 755 arm-elf-tools-20030314.sh然后再執(zhí)行程序的安裝??蓤?zhí)行文件按會(huì)被默認(rèn)安裝在/usr/local/bin目錄下。
2.編譯Linux uClinux內(nèi)核
Linux uClinux是一款支持無(wú)MMU單元的嵌入式操作系統(tǒng),我們可以從其官方網(wǎng)站獲取最新版本的內(nèi)核文件(www.Linux uClinux.org)。我們將下載的Linux uClinux內(nèi)核文件放入我們的工作目錄(/home/jelly/kernel/),然后使用tar工具解壓內(nèi)核文件。
$cd /home/jelly/kernel/$tar xvzf Linux uClinux-dist-200xxxxx.tar.gz經(jīng)過(guò)一段時(shí)間的解壓后將在工作目錄下會(huì)生成Linux uClinux-dist文件夾。在編譯內(nèi)核之前我們首先要做的是配置內(nèi)核,常用的配置方式有如下幾種:
make xconfig - X Windows圖形界面的配置選項(xiàng)
make menuconfig - Console圖形界面的配置選項(xiàng)
make config - 命令接口的配置選項(xiàng)
在這里需要注意的是Linux uClinux是不支持loadable modules的,因此應(yīng)該取消對(duì)該模塊的支持。
$cd Linux uClinux-dist/
$make menuconfig
配置你需要的選項(xiàng),比如處理器類型,開發(fā)板類型,內(nèi)核版本等。配置好之后選擇Saving and Exiting保存退出。
編譯Linux uClinux內(nèi)核的常用選項(xiàng)有:make distclean該命令將清除以前編譯時(shí)候產(chǎn)生的文件,包括.config文件,所有目標(biāo)文件以及內(nèi)核映象文件。make clean該命令與make distclean相似,也是清除之前編譯時(shí)候產(chǎn)生的文件make dep 這個(gè)只需要在第一次編譯的時(shí)候執(zhí)行,為了是建立文件之間的依賴關(guān)系,make命令會(huì)根據(jù)這個(gè)依賴關(guān)系來(lái)確定哪些文件需要重新編譯,哪些文件可以跳過(guò)。
make lib_only編譯uClibcx庫(kù),make user_only編譯用戶制定的應(yīng)用程序,比如初始化進(jìn)程init,bash,以及集成了很多常用工具的嵌入式軟件包busybox。make romfsLinux uClinux經(jīng)常才用romfs(只讀文件系統(tǒng))來(lái)作為系統(tǒng)的根文件系統(tǒng),所以首先需要將之前編譯的很多應(yīng)用程序以Linux uClinux所需要的目錄格式存放起來(lái)。
比如將可執(zhí)行文件放在bin目錄下,將配置文件放在etc目錄下。該命令執(zhí)行后會(huì)在Linux uClinux-dist目錄下生成一個(gè)romfs的目錄,并且將文件系統(tǒng)所需要的文件組織起來(lái),以便之后生成fomfs的映象文件。
make image生成romfs文件系統(tǒng)的映象文件,以及l(fā)inux的映象文件。該Linux的映象文件是elf格式的,是不能直接下載到開發(fā)板上執(zhí)行的(里面包含了大量的調(diào)試信息,elf文件執(zhí)行前的環(huán)境建立信息等內(nèi)容。該文件可以使用arm-elf-objcopy工具來(lái)生成可以直接在RAM中執(zhí)行的binary文件)。
make linux執(zhí)行該命令之后將生成linux內(nèi)核文件。make zImage建立經(jīng)過(guò)gzip算法壓縮過(guò)的內(nèi)核映象文件,通常zImage產(chǎn)生的內(nèi)核映象文件無(wú)法超過(guò)512KB大小。make modules建立內(nèi)核模塊注:有些Linux uClinux版本提供了更多的編譯方式,比如make linux.bin。關(guān)于其他的編譯方式可以參看內(nèi)核源碼目錄里的Makefile文件。
在介紹完常用的幾個(gè)內(nèi)核編譯命令后,我們可以使用如下的幾個(gè)命令來(lái)建立我們所需要的內(nèi)核以及文件系統(tǒng):
make dep
make clean
make all
這樣在Linux uClinux-dist/linux-2.x.x目錄下會(huì)生成linux, System.map,在Linux uClinux-dist/images/目錄下會(huì)生成image.bin, linux.bin, image.ram, image.rom, romfs.img, linux.text, linux.data等文件。
如果你編譯過(guò)程中沒(méi)有出現(xiàn)錯(cuò)誤,但是沒(méi)有我說(shuō)的這些文件,你可以參看Makefile文件了解更多的東西。其中image.ram是直接可以下載到ram中執(zhí)行的文件。在調(diào)試階段我們就可以使用該文件。image.rom是一個(gè)zImage文件,可以自解壓的內(nèi)核,該文件需要少寫到FLASH里,而不能直接放入RAM中執(zhí)行。
3.Linux uClinux內(nèi)核建立過(guò)程
建立內(nèi)核首先是建立單獨(dú)的內(nèi)核模塊和內(nèi)核子系統(tǒng),一旦這些建立好了之后將通過(guò)連接文件將多個(gè)文件連接在一起。該連接文件一般在arch/$(ARCH)/$(PLATFORM)/$(BOARD)/$(MODEL).ld。連接器使用該連接文件生成linux文件:LD -T (MODUEL).ld crt0_$(MODUEL).o [objs] -o linux連接文件定義了內(nèi)核如何組織內(nèi)存段。
System.map文件是通過(guò)linux文件產(chǎn)生的,用于調(diào)試使用。通過(guò)該文件可以方便的確定函數(shù)的位置。該文件是通過(guò)如下方式產(chǎn)生:
NM $(LINUX) | grep -v '\(compiled\)\|\(\.o$$\)\|\(a\)' | sort > System.map
linux.data文件是包含內(nèi)核所有數(shù)據(jù)段的代碼,是通過(guò)移除linux文件中所有只讀段和其他不需要的段得到的,該文件可以通過(guò)arm-elf-objcopy來(lái)產(chǎn)生,如:
OBJCOPY -O binary --remove-section=.romvec --remove-section=.text\
--remove-section=.ramvec --remove-section=.bss\
--remove-section.eram linux linux.data
linux.text文件包含了所有文本段代碼,是去除數(shù)據(jù)段后的代碼OBJCOPY -O binary --remove-section=.ramvec --remove-section=.bss\
--remove-section-.data --remove-section=.eram\
--set-section-flags=.romvec=CONTENTS,ALLOC,LOAD,READONLY,CODE linux linux.text
linux.bin文件,是可以實(shí)際載入內(nèi)存中執(zhí)行的文件,他的建立是通過(guò)linux.text和linux.data兩個(gè)文件連接得到的,如:cat linux.text linux.data > linux.bin
該文件只是內(nèi)核,并沒(méi)有包含文件系統(tǒng)。我們可以使用如下方式將文件系統(tǒng)和內(nèi)核文件連接起來(lái)生成image.bin映象文件:cat linux.bin romfs.img > image.bin
4.手工生成ROMFS文件系統(tǒng)
建立ROMFS文件系統(tǒng)之前應(yīng)該手工建立文件系統(tǒng)樹,例如通常ROMFS包含如下目錄:/bin /dev /etc /lib /proc /sbin /tmp /usr /var然后我們可以將交叉編譯好的應(yīng)用程序放入/bin目錄中,之后使用genromfs工具來(lái)建立文件系統(tǒng)的映象,如:genromfs -v -V "ROM Disk" -f romfs.img -d romfs > romfs.map
最后,可以與內(nèi)核文件連接在一起,然后燒入Flash中。cat linux.bin romfs.img > image.bin
5.參考文檔
《構(gòu)建嵌入式LINUX系統(tǒng)》 O'REILLY
《Linux How To》
《Linux Documentation》
【編輯推薦】