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