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