版權(quán)聲明:轉(zhuǎn)載時請以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明 http://tigerwang202./logs/43927976.html
首先從Blackfin uClinux網(wǎng)站下載最新版uClinux內(nèi)核,。
http://blackfin./gf/project/uclinux-dist/frs/
上述地址除了提供內(nèi)核源代碼外,,還提供一些預(yù)編譯的內(nèi)核文件供特定電路板使用。如果使用ADI官方的驗(yàn)證板,,可從中選擇適合板子的編譯好的內(nèi)核文件,。
那些內(nèi)核文件一般沒有后綴擴(kuò)展名,你在下載之后可以使用UNIX的file命令察看文件類型,,例如:
file linux-2.6.x/linux
linux-2.6.x/linux: ELF 32-bit LSB executable, version 1 (SYSV), statically linked, not stripped
ELF是預(yù)編譯的存儲器映像文件,,它可直接下載至目標(biāo)板。這些文件不需要編譯,,拿來就可直接使用,。
還有一類是tar.bz2為后綴的源代碼壓縮包文件,為了編譯內(nèi)核,,你需要下載它,。撰寫本文時,,筆者下載的是:
uClinux-dist-2008R1.5-RC3.tar.bz2
將其解壓縮至項(xiàng)目根目錄下的kernel文件夾。例如,,筆者的內(nèi)核源碼放置在/home/uclinux/kernel/uClinux-dist-2008R1.5-RC3文件夾,。
tar –vxjf uClinux-dist-2008R1.5-RC3.tar.bz2
在你為目標(biāo)板建立內(nèi)核的過程中,配置屬于最初的階段,。內(nèi)核配置的方法很多,,而且配置設(shè)置時有很多選項(xiàng)可以選擇。不管你使用哪種方法設(shè)定設(shè)置或者選擇哪些配置選項(xiàng),,在你設(shè)定好配置后都將產(chǎn)生.config文件以及建立過程其余步驟將會用到的一些符號連接和頭文件,。
以下的配置過程我們使用一個文本界面的設(shè)置程序,這也是最常用的設(shè)置方法,。
如果使用的是Debian系統(tǒng),,默認(rèn)安裝沒有ncurses庫的,使用make menuconfig會提示出錯,,需要先運(yùn)行下列命令安裝這個庫:
apt-get install libncurses5-dev
切換至內(nèi)核源代碼目錄,,運(yùn)行以下命令配置內(nèi)核。該命令提供一個基于文本界面的友好的內(nèi)核設(shè)置界面,。
make menuconfig
注意:如果你先前從一個平臺設(shè)置切換至另一平臺,,你需要先運(yùn)行 make clean 命令,以避免編譯內(nèi)核時可能出現(xiàn)的錯誤,。一個比較可靠地方式是:無論在什么時候,,在你配置內(nèi)核時,都運(yùn)行make clean 命令,。
一
些用戶可能使用make xconfig命令來配置內(nèi)核,,這個命令提供一個圖形化的配置。較新版本的內(nèi)核可能要求你安裝有QT圖形庫以運(yùn)行make
xconfig命令,。如果,,你沒有安裝那些庫make xconfig命令會出錯(例如Debian的默認(rèn)安裝就沒提供QT庫),這時可以使用 make
menuconfig命令,,它是除了基于文本界面外,,其它功能都是相同的?;蛘?,你可以使用下列命令安裝QT庫(僅適用于Debian)
apt-get install tk8.4
注:筆者下載的源碼包使用TK的GUI庫,故使用上述命令安裝,。
下面的設(shè)置在menuconfig的文本設(shè)置界面中進(jìn)行,。
在輸入make menuconfig命令后,終端會輸出一些信息,隨后出現(xiàn)文本設(shè)置界面,,如下圖所示,。
選擇” Vendor/Product Selection”(生產(chǎn)商/產(chǎn)品選擇)選項(xiàng)。
在Vendor/Product Selection窗
口中,,請確認(rèn)Analog
Device被設(shè)置為Vendor(如上圖所示),。這里,我們選擇一塊BF533-STAMP的驗(yàn)證板作為編譯目標(biāo),。(我們僅僅是為了演示整個編譯過程,,
在下面的文章里將介紹如何添加自己的板子作為編譯目標(biāo))在你選擇一塊驗(yàn)證板作為編譯目標(biāo)時,系統(tǒng)默認(rèn)會根據(jù)該目標(biāo)板的配置文件加載一些默認(rèn)設(shè)置,。
選擇<Exit>返回“Main Menu”界面,。一個對話框會出現(xiàn)提示“是否新的內(nèi)核設(shè)置”,選擇“Yes”,。
選擇“Kernel/Library/Defaults Selection”選項(xiàng),。出現(xiàn)“Kernel/Library/Defaults Selection”窗口。
選中“Customize Kernel Setting”和“Customize Vendor/User Settings”選項(xiàng),。選擇的方法是在選擇該條目的情況下按”Y”鍵,。
選擇<Exit>返回主界面。選擇Exit退出并保存設(shè)置,。終端界面在執(zhí)行一長串命令后,顯示“Linux Kernel Configuration”界面,。
在
內(nèi)核設(shè)置窗口中你可以進(jìn)行各種內(nèi)核選項(xiàng)和設(shè)備驅(qū)動設(shè)置,。如果這是你第一次編譯內(nèi)核,在你不知道這些選項(xiàng)的確切意義之前,,強(qiáng)烈建議你不要修改任何選項(xiàng)(因?yàn)?
我們練習(xí)的目的是熟練內(nèi)核編譯的流程,,使用默認(rèn)的選項(xiàng)就可以。)在下面的文章中你將學(xué)習(xí)如何設(shè)置內(nèi)核使其適合特定的目標(biāo)板,。
選擇<Exit>退出設(shè)置,。一個對話框會出現(xiàn)提示“是否新的內(nèi)核設(shè)置”,選擇“Yes”,。
在
終端執(zhí)行一些命令后,,出現(xiàn)“uClinux v3.2.0
Configuration”窗口。在這個窗口中,,你可以設(shè)置各種應(yīng)用程序(它們可能是ADI預(yù)先demo程序,,用來演示uClinux上的一些特定應(yīng)
用,如音頻,、視頻播放器等),。如果這是你第一次編譯內(nèi)核,還是建議保持缺省設(shè)置,不要做任何修改,。
選擇<Exit>退出并保存設(shè)置,。一個對話框會出現(xiàn)提示“是否新的內(nèi)核設(shè)置”,選擇“Yes”,。
提示:有些程序是實(shí)驗(yàn)性的,,可能通不過編譯或者導(dǎo)致不穩(wěn)定。
設(shè)置工作至此結(jié)束,。運(yùn)行下列命令開始編譯,。編譯過程中將更新內(nèi)核及根文件系統(tǒng)。編譯將耗時5至10min,,所需時間可能根據(jù)你選擇組件的數(shù)量略有增加或縮短,。如果在虛擬機(jī)中運(yùn)行交叉編譯器時間將成倍增長。
編譯成功后會在images子目錄下生成一大批可通過U-Boot加載至目標(biāo)板的內(nèi)核文件,。這些內(nèi)核映像文件將在下文中作詳細(xì)討論,。關(guān)于U-Boot的詳細(xì)信息請參考前幾章節(jié)。
在你完成對一些應(yīng)用程序的裁剪后,,通常輸入make命令對系統(tǒng)進(jìn)行編譯,。如果一切順利,在幾分鐘的等待后,,編譯后的文件將存放在一個稱作
images的子目錄中(它位于uClinux源碼根目錄下),。使用cd命令切換至該目錄,并用ls命令列出其中包含的文件,。你會得到如下圖所示的一批文
件,。那些不同的文件有什么明確的用途嗎?
總的說來,,這些文件可以分成兩大類:內(nèi)核文件 和 根文件系統(tǒng)
請
注意以下操作適用于所有ADI的驗(yàn)證板,。你的板子的設(shè)置可以與上面的生成的文件不同,你可以按照自己的喜好配置需要生成什么,,不需要生成什么以及生成文件
保存的路徑,。具體的映像(image)生成過程在make文件vendors/<company>/<board>
/Makefile中描述。舉例,,我們上文使用 BF533-STAMP的驗(yàn)證板作為編譯目標(biāo),,它的編譯設(shè)置在vendors/AnalogDevices/BF533-EZKIT/Makefile中描述。
然
而為了避免重復(fù)設(shè)置,,那個映像(image)目標(biāo)可能指向vendors/AnalogDevices/vendor.mak中定義的目標(biāo),。如果你希望自
己的板子像上面那樣結(jié)構(gòu)生成image文件,你可以在不通過拷貝設(shè)置文件情況下重新使用那些設(shè)置,??梢詤⒖紇endors/Bluetechnix
/CM-BF537U/Makefile作為重寫使用 Analog Device驗(yàn)證板設(shè)置的例子,。
內(nèi)核映像:
內(nèi)核映像有很多種。它可以是ELF格式,,或者是可引導(dǎo)的U-Boot映像格式,。它可以和一個根文件系統(tǒng)捆綁在一起?;蛘邇H僅是內(nèi)核本身,。
格式:
內(nèi)核如果是可引導(dǎo)的U-Boot格式,它一般地會在文件名中包含Image字符串(諸如uImage或vmImage),,而ELF格式的內(nèi)核通常在文件名中包含linux字符串(諸如linux或vmlinux),。
大
多數(shù)情況下你應(yīng)該使用U-Boot格式的可引導(dǎo)內(nèi)核映像。U-Boot格式包括壓縮過程,,這使得內(nèi)核文件體積更小,,同時U-Boot也很容易引導(dǎo)它。如果
你對啟動速度的要求超過對空間的節(jié)省,,你應(yīng)該使用ELF格式的映像引導(dǎo),。ELF格式的文件是不進(jìn)行壓縮的(這意味著其體積較大),但是加載過程卻往往會變
更快,,因?yàn)檫@只涉及一些存儲器拷貝過程,。ELF格式的影響通常會含有大量的用以描述它自己的“meta”信息,而U-Boot格式卻剝離一切不必要的信
息,。
擴(kuò)展名:
那些包含根文件系統(tǒng)的內(nèi)核會有擴(kuò)展名作為其文件類型(例如.ext2或.initramfs),。那些不帶根文件系統(tǒng)的內(nèi)核沒有擴(kuò)展名。
那
些附帶有根文件系統(tǒng)的內(nèi)核通常在你需要完全在RAM中運(yùn)行根文件系統(tǒng)的系統(tǒng)中使用,。如果你需要在一個外部存儲器(諸如 并行Flash 或
串行Flash等等)上運(yùn)行根文件系統(tǒng),,那么通常需要一個單獨(dú)的內(nèi)核映像(standalone Kernel
image)。例如,,當(dāng)根文件系統(tǒng)在RAM中運(yùn)行時,你對其作的任何修改將在系統(tǒng)重啟后消失,。一個非易失的根文件系統(tǒng)只能存儲于外部設(shè)備中,。
舉例:
這里以本文編譯的uClinux映像為例,編譯過程生成了下列常見的映像文件:
vmlinux
|
ELF格式的Linux 內(nèi)核映像 - 不含根文件系統(tǒng)
|
linux
|
“缺省”linux.rootfs 文件的符號鏈接
|
linux.cramfs
|
ELF格式的Linux內(nèi)核,,包含CRAMFS文件系統(tǒng)
|
linux.ext2
|
ELF格式的Linux內(nèi)核,,包含EXT2文件系統(tǒng)
|
linux.initramfs
|
ELF格式的Linux內(nèi)核,包含cpio歸檔的文件系統(tǒng)
|
linux.initramfs.gz
|
ELF格式的Linux內(nèi)核,,包含一個壓縮的cpio歸檔的文件系統(tǒng)
|
linux.romfs
|
ELF格式的Linux內(nèi)核,,包括一個ROMFS文件系統(tǒng)
|
vmImage
|
U-Boot可引導(dǎo)格式的Linux內(nèi)核 - 不含根文件系統(tǒng)
|
uImage
|
“缺省”uImage.rootfs文件的符號鏈接
|
uImage.cramfs
|
U-Boot可引導(dǎo)格式的Linux內(nèi)核,包含CRAMFS文件系統(tǒng)
|
uImage.ext2
|
U-Boot可引導(dǎo)格式的Linux內(nèi)核,,包含EXT2文件系統(tǒng)
|
uImage.initramfs
|
U-Boot可引導(dǎo)格式的Linux內(nèi)核,,包含cpio歸檔的文件系統(tǒng)
|
uImage.initramfs.gz
|
U-Boot可引導(dǎo)格式的Linux內(nèi)核,包含壓縮的cpio歸檔的文件系統(tǒng)
|
uImage.romfs
|
U-Boot可引導(dǎo)格式的Linux內(nèi)核,包含ROMFS文件系統(tǒng)
|
.initramfs
與initramfs.gz區(qū)別的原因在于U-Boot格式映像已經(jīng)包括壓縮功能,,initramfs.gz意味著根文件系統(tǒng)進(jìn)行雙重壓縮,。因此,對于一
個U-Boot格式的可引導(dǎo)映像,,使用uImage.initramfs.gz是個壞主意,,而應(yīng)使用.initramfs 。當(dāng)對ELF文件格式(通過
不進(jìn)行壓縮),,應(yīng)該使用initramfs.gz ,。
文件系統(tǒng)映像:
文件系統(tǒng)映像以rootfs開頭,以描述該文件系統(tǒng)的短名稱作為后綴,。如果你樂意的話,,可以在開發(fā)環(huán)境中作為(root back設(shè)備)掛在映像。并通過這種方式瀏覽文件系統(tǒng)的內(nèi)容,。
文件系統(tǒng)映像很少會在目標(biāo)板上“直接”使用,。大多數(shù)情況下,你將它們燒寫至Flash或其他什么存儲設(shè)備中,,然后在引導(dǎo)Linux時掛載,。
根
文件系統(tǒng)映像通常存放在兩個地方。大部分的映像存放于uClinux源碼根目錄下的romfs文件夾,。因?yàn)樗话O(shè)備節(jié)點(diǎn)(device
nodes),,創(chuàng)建工具會生產(chǎn)一個文件(通常稱作device_table.txt)用以為最終映像的/dev目錄和相關(guān)的設(shè)備節(jié)點(diǎn)創(chuàng)建正確的major
/minor值 與權(quán)限?!咀ⅲ涸诠P者使用的版本中根文件系統(tǒng)映像一并放置于images目錄下】
文件名
|
描述
|
rootfs.cramfs
|
CRAMFS格式的根文件系統(tǒng)
|
rootfs.ext2
|
EXT2格式的根文件系統(tǒng)
|
rootfs.initramfs
|
cpio歸檔格式的根文件系統(tǒng)
|
rootfs.initramfs.gz
|
cpio歸檔格式的并使用gzip壓縮的根文件系統(tǒng)
|
rootfs.jffs2
|
JFFS2格式的根文件系統(tǒng)
|
rootfs.romfs
|
ROMFS格式的根文件系統(tǒng)
|
rootfs.yaffs
|
YAFFS格式的根文件系統(tǒng)
|
rootfs.yaffs2
|
YAFFS2格式的根文件系統(tǒng)
|
其它文件:
System.map文件提供給每個相關(guān)的Linux內(nèi)核映像,。與linux映像類似,它帶有rootfs的后綴因此你很容易匹配兩者,。
有時內(nèi)核映像文件將以一種更直觀的方式提供,,從其名稱就可了解其包含文件系統(tǒng)的類型。如果是這種情況,,映像文件命令類似于rootfs帶有.contents(.內(nèi)容)的后綴,。
|