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