uClinux移植概述
作者:薑江
E-mail:jznsmail@tom.com
Blog:http://blog.csdn.net/jznsmail
1.建立開發環境
作為uClinux系統的移植和開發的主機最好使用Linux作業系統,如果選擇Windows平台作為開發平台則需要Cygwin軟體包的支援。在這裡我們選用的開發平台是Fedora Core 2,核心版本為2.4.x。在進行uClinux的移植和開發之前,我們需要建立系統的交叉編譯環境,因為做為主機我們使用的是IA32體繫結構的處理器,而開發板我們才用的是ARM體繫結構的處理器。ARM平台的交叉編譯工具可以從uClinux的官方網站獲得(www.uclinux.org)。在這裡我們採用的是arm-elf-tools-20030314.sh,該檔案是一個自解壓檔案,可以直接執行程式安裝。
#./arm-elf-tools-20030314.sh
如果不能執行該檔案,則需要修改一下檔案的可執行屬性
#chmod 755 arm-elf-tools-20030314.sh
然後再執行程式的安裝。可執行檔按會被預設安裝在/usr/local/bin目錄下。
2.編譯uClinux核心
uClinux是一款支援無MMU單元的嵌入式作業系統,我們可以從其官方網站擷取最新版本的核心檔案(www.uclinux.org)。
我們將下載的uClinux核心檔案放入我們的工作目錄(/home/jelly/kernel/),然後使用tar工具解壓核心檔案。
$cd /home/jelly/kernel/
$tar xvzf uClinux-dist-200xxxxx.tar.gz
經過一段時間的解壓後將在工作目錄下會產生uClinux-dist檔案夾。
在編譯核心之前我們首先要做的是配置核心,常用的配置方式有如下幾種:
make xconfig - X Windows圖形介面的配置選項
make menuconfig - Console圖形介面的配置選項
make config - 命令介面的配置選項
在這裡需要注意的是uClinux是不支援loadable modules的,因此應該取消對該模組的支援。
$cd uClinux-dist/
$make menuconfig
配置你需要的選項,比如處理器類型,開發板類型,核心版本等。配置好之後選擇Saving and Exiting儲存退出。
編譯uClinux核心的常用選項有:
make distclean
該命令將清除以前編譯時間候產生的檔案,包括.config檔案,所有目標檔案以及核心映象檔案。
make clean
該命令與make distclean相似,也是清除之前編譯時間候產生的檔案
make dep 這個只需要在第一次編譯的時候執行,為了是建立檔案之間的依賴關係,make命令會根據這個依賴關係來確定哪些檔案需要重新編譯,哪些檔案可以跳過。
make lib_only
編譯uClibc庫
make user_only
編譯使用者制定的應用程式,比如初始化進程init,bash,以及整合了很多常用工具的嵌入式軟體包busybox。
make romfs
uClinux經常才用romfs(唯讀檔案系統)來作為系統的根檔案系統,所以首先需要將之前編譯的很多應用程式以uClinux所需要的目錄格式存放起來。比如將可執行檔放在bin目錄下,將設定檔放在etc目錄下。該命令執行後會在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
建立核心模組
註:有些uClinux版本提供了更多的編譯方式,比如make linux.bin。關於其他的編譯方式可以參看核心源碼目錄裡的Makefile檔案。
在介紹完常用的幾個核心編譯命令後,我們可以使用如下的幾個命令來建立我們所需要的核心以及檔案系統:
make dep
make clean
make all
這樣在uClinux-dist/linux-2.x.x目錄下會產生linux, System.map,在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.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》