嵌入式Linux開發(fā)環(huán)境的搭建之:嵌入式開發(fā)環(huán)境的搭建
5.1.5Linux內(nèi)核源碼目錄結(jié)構(gòu)
Linux內(nèi)核源碼的目錄結(jié)構(gòu)如圖5.24所示。
n /include子目錄包含了建立內(nèi)核代碼時所需的大部分包含文件,這個模塊利用其他模塊重建內(nèi)核。
n /init子目錄包含了內(nèi)核的初始化代碼,這里的代碼是內(nèi)核工作的起始入口。
n /arch子目錄包含了所有處理器體系結(jié)構(gòu)特定的內(nèi)核代碼。如:arm、i386、alpha。
n /drivers子目錄包含了內(nèi)核中所有的設(shè)備驅(qū)動程序,如塊設(shè)備和SCSI設(shè)備。
n /fs子目錄包含了所有的文件系統(tǒng)的代碼,如:ext2、vfat等。
n /net子目錄包含了內(nèi)核的網(wǎng)絡(luò)相關(guān)代碼。
n /mm子目錄包含了所有內(nèi)存管理代碼。
n /ipc子目錄包含了進程間通信代碼。
n /kernel子目錄包含了內(nèi)核核心代碼。
5.1.6制作文件系統(tǒng)
讀者把上一節(jié)中所編譯的內(nèi)核壓縮映像下載到開發(fā)板后會發(fā)現(xiàn),系統(tǒng)在進行了一些初始化的工作之后,并不能正常啟動,如圖5.25所示。
可以看到,系統(tǒng)啟動時發(fā)生了加載文件系統(tǒng)的錯誤。要記住,上一節(jié)所編譯的僅僅是內(nèi)核,文件系統(tǒng)和內(nèi)核是完全獨立的兩個部分。讀者可以回憶一下第2章講解的Linux啟動過程的分析(嵌入式Linux是Linux裁減后的版本,其精髓部分是一樣的),其中在head.S中就加載了根文件系統(tǒng)。因此,加載根文件系統(tǒng)是Linux啟動中不可缺少的一部分。本節(jié)將講解嵌入式Linux中文件系統(tǒng)的制作方法。
圖5.25系統(tǒng)啟動錯誤
制作文件系統(tǒng)的方法有很多,可以從零開始手工制作,也可以在現(xiàn)有的基礎(chǔ)上添加部分內(nèi)容并加載到目標板上去。由于完全手工制作工作量比較大,而且也很容易出錯,因此,本節(jié)將主要介紹把現(xiàn)有的文件系統(tǒng)加載到目標板上的方法,主要包括制作文件系統(tǒng)映像和用NFS加載文件系統(tǒng)的方法。
1.制作文件系統(tǒng)映像
讀者已經(jīng)知道,Linux支持多種文件系統(tǒng),同樣,嵌入式Linux也支持多種文件系統(tǒng)。雖然在嵌入式系統(tǒng)中,由于資源受限的原因,它的文件系統(tǒng)和PC機Linux的文件系統(tǒng)有較大的區(qū)別,但是,它們的總體架構(gòu)是一樣的,都是采用目錄樹的結(jié)構(gòu)。在嵌入式系統(tǒng)中常見的文件系統(tǒng)有cramfs、romfs、jffs、yaffs等,這里就以制作cramfs文件系統(tǒng)為例進行講解。cramfs文件系統(tǒng)是一種經(jīng)過壓縮的、極為簡單的只讀文件系統(tǒng),因此非常適合嵌入式系統(tǒng)。要注意的是,不同的文件系統(tǒng)都有相應(yīng)的制作工具,但是其主要的原理和制作方法是類似的。
在嵌入式Linux中,busybox是構(gòu)造文件系統(tǒng)最常用的軟件工具包,它被非常形象地稱為嵌入式Linux系統(tǒng)中的“瑞士軍刀”,因為它將許多常用的Linux命令和工具結(jié)合到了一個單獨的可執(zhí)行程序(busybox)中。雖然與相應(yīng)的GNU工具比較起來,busybox所提供的功能和參數(shù)略少,但在比較小的系統(tǒng)(例如啟動盤)或者嵌入式系統(tǒng)中已經(jīng)足夠了。busybox在設(shè)計上就充分考慮了硬件資源受限的特殊工作環(huán)境。它采用一種很巧妙的辦法減少自己的體積:所有的命令都通過“插件”的方式集中到一個可執(zhí)行文件中,在實際應(yīng)用過程中通過不同的符號鏈接來確定到底要執(zhí)行哪個操作。例如最終生成的可執(zhí)行文件為busybox,當為它建立一個符號鏈接ls的時候,就可以通過執(zhí)行這個新命令實現(xiàn)列出目錄的功能。采用單一執(zhí)行文件的方式最大限度地共享了程序代碼,甚至連文件頭、內(nèi)存中的程序控制塊等其他系統(tǒng)資源都共享了,對于資源比較緊張的系統(tǒng)來說,真是最合適不過了。在busybox的編譯過程中,可以非常方便地加減它的“插件”,最后的符號鏈接也可以由編譯系統(tǒng)自動生成。
下面用busybox構(gòu)建FS2410開發(fā)板的cramfs文件系統(tǒng)。
首先從busybox網(wǎng)站下載busybox源碼(本實例采用的busybox-1.0.0)并解壓,接下來,根據(jù)實際需要進行busybox的配置。
[root@localhostfs2410]#tarjxvfbusybox-1.00.tar.bz2
[root@localhostfs2410]#cdbusybox-1.00
[root@localhostbusybox-1.00]#makedefconfig/*首先進行默認配置*/
[root@localhostbusybox-1.00]#makemenuconfig
此時需要設(shè)置平臺相關(guān)的交叉編譯選項,操作步驟為:先選中“BuildOptions”項的“DoyouwanttobuildBusyboxwithaCrossComplier?”選項,然后將“CrossCompilerprefix”設(shè)置為“/usr/local/arm/3.3.2/bin/arm-linux-”(這是在實驗主機中的交叉編譯器的安裝路徑)。
圖5.26busybox配置畫面
下一步編譯并安裝busybox。
[root@localhostbusybox-1.00]#make
[root@localhostbusybox-1.00]#makeinstallPREFIX=/home/david/fs2410/cramfs
其中,PREFIX用于指定安裝目錄,如果不設(shè)置該選項,則默認在當前目錄下創(chuàng)建_install目錄。創(chuàng)建的安裝目錄的內(nèi)容如下所示:
[root@localhostcramfs]#ls
binlinuxrcsbinusr
從此可知,使用busybox軟件包所創(chuàng)建的文件系統(tǒng)還缺少很多東西。下面我們通過創(chuàng)建系統(tǒng)所需要的目錄和文件來完善一下文件系統(tǒng)的內(nèi)容。
[root@localhostcramfs]#mkdirmntrootvartmpprocbootetclib
[root@localhostcramfs]#mkdir/var/{lock,log,mail,run,spool}
如果busybox是動態(tài)編譯的(即在配置busybox時沒選中靜態(tài)編譯),則把所需的交叉編譯的動態(tài)鏈接庫文件復(fù)制到lib目錄中。
linux相關(guān)文章:linux教程
評論