幾種Linux下嵌入式開(kāi)發(fā)環(huán)境的簡(jiǎn)單介紹
uCLinux之前僅是核心的一些補丁,后來(lái)發(fā)展成為一個(gè)包括核心、庫、應用程序、工具和編譯相關(guān)的配置文件的一個(gè)集成開(kāi)發(fā)環(huán)境。與 buildroot不同的是,uCLinux不編譯目標系統的工具集,也就是說(shuō),相應的編譯工具應該提前安裝好。如,對于arm來(lái)說(shuō),需要先安裝ARM交叉編譯器。uCLinux的編譯器也需要一些補丁,其中比較重要的兩個(gè)方面主要包括:
本文引用地址:http://dyxdggzs.com/article/264709.htm用于生成FLT文件的補?。河捎贛MU的關(guān)系,uCLinux不支持ELF可執行文件,這個(gè)補丁主要包括bin2flt工具包和一個(gè)ld的wrapper腳本等,用于(透明于用戶(hù))生成FLT文件;
用于支持XIP(Execute In Place)的補?。哼@個(gè)補丁需要對gcc進(jìn)行一些小的修改;支持XIP主要是為了解決小內存環(huán)境中運行的問(wèn)題。
XIP不一定適用于每種應用環(huán)境,對于內在要求特別嚴格的系統來(lái)說(shuō)(空間第一位,如手機要求使用片內RAM),可以通過(guò)將核心和應用程序編譯為 XIP支持,然后直接在Flash上運行,內存僅用于運行時(shí)數據;而對于性能要求為主的系統(如高速網(wǎng)絡(luò )處理器),則不能因為節省一點(diǎn)空間而使用XIP將程序直接在Flash上運行,這樣可能會(huì )降低指令的讀取速度而影響系統性能(但仍然可以使用 XIP,使程序的多個(gè)實(shí)例在內存中共享代碼空間,以后詳細說(shuō)); + FLT可執行文件支持動(dòng)態(tài)鏈接庫(目前僅m68k支持,參見(jiàn) uCdot: Shared libraries under uCLinux mini-HOWTO)的補丁;
uCLinux的編譯過(guò)程大致是,首先,通過(guò)可視配置界面(menuconfig/xconfig)選取Vendor和board(實(shí)際上是選擇了一些配置文件和產(chǎn)品相關(guān)的文件),然后根據選擇構造一個(gè)適用于target的開(kāi)發(fā)環(huán)境,如生成頭文件和需要的庫文件(uClibc、glibc或 uC-libc 以及其它一些庫),然后編譯核心、庫、應用程序,最后將所有的輸出安裝到romfs目錄中,根據需要生成目標平臺需要的映像文件(如: romfs.img、Linux.bin、rootfs.gz等)
由于一些過(guò)程細節被隱藏起來(lái),uCLinux現在的編譯過(guò)程方便到只需要配置一下(make menuconfig),然后 make 就可以直接獲得最終輸出。不過(guò)這反倒成為一些初學(xué)者學(xué)習的一個(gè)麻煩,本文完成后,根據對本文的反饋,將進(jìn)一步對uCLinux進(jìn)行詳細介紹。
總的來(lái)說(shuō),目前的uCLinux是一套主要用于無(wú)MMU核(但不限于此)的嵌入式Linux集成環(huán)境,也是一個(gè)非常好的 Linux from scratch 的示例。拋開(kāi)其MMU相關(guān)的補丁,uCLinux也可以作為一套用于包含MMU系統的集成開(kāi)發(fā)環(huán)境,Snapgear 就是一個(gè)很好的例子。實(shí)際上,我們可以從官方的uCLinux源碼就可以直接編譯一個(gè)支運行于X86的uCLinux。
Scratchbox
Scratchbox 的故事要從buildroot講起(這不一定是scratchbox開(kāi)發(fā)者的故事,只是依據我個(gè)人的認識)。buildroot可以從頭開(kāi)始,先構造編譯器和基本開(kāi)發(fā)環(huán)境,然后根據用戶(hù)配配置構造一個(gè)適用于目標平臺的根文件系統。這個(gè)文件系統可以有許多用法,例如,做為initrd或通過(guò)NFS輸出給目標系統使用。為了減少交叉編譯軟件帶來(lái)的麻煩,可以配置buidroot創(chuàng )建一套目標系統的編譯環(huán)境(Gcc、binutils、lib等),這樣用戶(hù)可以通過(guò)這個(gè)基本文系統在目標系統上直接本地編譯軟件。如果目標系統性能足夠的話(huà),buildroot的任務(wù)到此就基本結束了。對于嵌入式系統的開(kāi)發(fā)者來(lái)說(shuō),在目標系統上直接編譯代碼卻不一定都能夠實(shí)現,因為多數情況下,我們的目標平臺處理器性能并不會(huì )那么高,這樣,我們就不得不面對一個(gè)兩難的選擇:
繼續通過(guò)buildroot編譯其它的軟件,性能會(huì )高許多,但每個(gè)軟件都需要進(jìn)行交叉編譯相關(guān)的改造;
在目標平臺上編譯軟件,對于只有幾十或幾百兆的低性能核來(lái)說(shuō),編譯一個(gè)核心可能會(huì )讓你等上半天的時(shí)間;
有沒(méi)有好的辦法解決性能和交叉編譯的問(wèn)題呢?先分析一下通過(guò)buildroot交叉編譯不能解決的問(wèn)題。Buildroot只在一定程度上對目標平臺進(jìn)行了模擬,但仍有一些是無(wú)法實(shí)現的,例如,當目標平臺不同于主機平臺時(shí),不能生成并運行目標平臺的中間代碼。這樣,許多通過(guò)autotools (autoconf/automake)配置的軟件就可能會(huì )出現問(wèn)題。例如,configure 腳本有時(shí)會(huì )生成一些中間代碼,并試圖運行以確認開(kāi)發(fā)環(huán)境中是否存在某個(gè)庫文件或頭文件,對于在X86上編譯基于uClibc X86目標平臺代碼可能不會(huì )出現問(wèn)題,但如果目標平臺是X86以外的平臺,編譯就可能會(huì )中斷;又如,configure腳本確認編譯器是否工作,會(huì )試圖編譯一個(gè)包含空的主程序的代碼并運行,實(shí)際一個(gè)可運行于目標平臺的 a.out 確實(shí)生成了,也可以正常運行于目標平臺,但是這個(gè)測試會(huì )因為 a.out 被運行在主機系統上而錯誤的中斷。這些問(wèn)題一些被 buildroot 通過(guò)補丁或復雜的 configure 參數解決了,某些中間執行文件,則通過(guò)HOSTCC(主機上的CC)來(lái)生成并運行以生成最終文件。目前buildroot包含的軟件或多或少都會(huì )有一些這樣的補丁,而且開(kāi)發(fā)者一旦深入到對軟件的定制,就會(huì )不停的被這些問(wèn)題所困擾。
Scratchbox相比于buildroot有幾方面的改進(jìn):
運行于 chroot 的環(huán)境,完全獨立于主機,編譯過(guò)程將基本與主機系統無(wú)關(guān)(并且scratchbox修改了一些庫,使得普通用戶(hù)可以chroot到編譯環(huán)境中,并且多個(gè)用戶(hù)可以同時(shí)使用一套Scratchbox開(kāi)發(fā)套件和完全獨立的用戶(hù)資源);
透過(guò)qemu模擬運行或sbrsh解決中間執行文件或類(lèi)似configure測試文件運行的問(wèn)題;
對(chroot后)的系統進(jìn)行修定,達到足以欺騙大多數軟件的效果,這并不是指的讓軟件可以不進(jìn)行改造就可以 交叉 編譯,而是使軟件 誤認為 這就是在目標平臺上編譯;
不過(guò) Scratchbox 目前還只能編譯 ARM 和 x86 的代碼,不能支持 buildroot 所支持的 ppc、mips等。
本文不詳述每一種環(huán)境,因此各個(gè)軟件都只是點(diǎn)到為止(雖然可以講得更詳細一些,但這些內容還是獨立出來(lái)比較好一些),不過(guò)這里還是引入一個(gè)很簡(jiǎn)單的示例,根據 scratchbox 網(wǎng)站上的文檔,安裝完成后,進(jìn)行簡(jiǎn)單配置就可以使用了(Debian用戶(hù)的安裝可以更簡(jiǎn)單,因為該站提供Deb包,直接apt-get就行了)。通過(guò) /scratchbox/login 登入開(kāi)發(fā)環(huán)境,通過(guò)sb-menu配置一個(gè)基于 ARM 的環(huán)境(其中 Select CPU-transparency method 選qemu不要先sbrsh),然后寫(xiě)一個(gè) helloword.c,編譯并運行之。 通過(guò)ldd可以看到,在沒(méi)有任可改動(dòng)的情況下,順利的生成了ARM ELF,但在 scratchbox 里卻可以在X86的主機上正常的運行!
[sbox-redice: ~] >gcc -o hello hello.c
[sbox-redice: ~] >file hellohello:
ELF 32-bit LSB executable, ARM, version 1 (ARM),
for GNU/Linux 2.0.0,dynamically linked (uses shared libs),
not stripped[sbox-redice: ~] >
./hellohelo world![sbox-redice: ~] >
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)linux相關(guān)文章:linux教程
評論