標籤:
前面兩篇文章分別介紹了mini2440開發板上啟動並執行bootloader和kernel,到這裡系統啟動後其實是停留在一個“僵死”的狀態---無法掛載根檔案系統。
這裡將介紹如何製作一個根檔案系統,並且掛載到核心中---即讓核心能夠訪問到檔案系統中的目錄和檔案。從使用者的角度來看檔案系統無非就是各個目錄和檔案,注意,這些目錄和檔案可以存在記憶體中,也可以存在Nand Flash 或者NOR Flash中,視具體的檔案系統而定。本文就用基於記憶體的initram 和基於網路的nfs檔案系統做例子介紹檔案系統的概念。
首先什麼是檔案系統?就本人理解而言,它就是作業系統提供的一種抽象,即作業系統將儲存介質抽象化,並提供一種訪問這種抽象的方法,讓使用者能夠簡潔且方便的訪問儲存介質(如硬碟和nand flash等)。為了實現這種抽象,作業系統把儲存介質進行單元劃分,檔案儲存體在介質時就佔據若干個單元。當然作業系統還記錄下各個檔案的基本屬性(如檔案大小、儲存位置、所屬人、存取權限等等),並組成一個檔案控制區(FCB)。所有檔案的FCB儲存在一個目錄檔案中,即一個目錄檔案就是內容是FCB的檔案,其自身也有FCB目錄檔案的FCB記錄在上一層目錄中,這樣層層往上串連就形成了樹狀目錄結構。或者這樣描述:檔案系統包含兩部分:一組檔案(即所要儲存的資料)和目錄檔案(目錄檔案的內容是每個檔案的FCB,FCB記錄了檔案的所有屬性)。如所示:
如所示是一個典型的Linux系統目錄結構,從使用者的角度看這就是Linux的檔案系統,從右往左看,假設run目錄下有個檔案file,那麼file的FCB就儲存在run目錄檔案中,而run又是一個檔案,其FCB 儲存在VAR這個目錄檔案中,最後var的FCB就儲存在根目錄檔案中。一次要訪問到file,實質就是要沿著/var/run/file 這樣一個路徑。但是從作業系統的角度來看,這僅僅是提供給使用者的可視性檔案系統,具體的實現細節(比如檔案的物理結構和邏輯結構)它已經隱藏起來。需要注意的是檔案系統儲存在外儲存空間中(nand flash等),記憶體中也會有相應的表明檔案屬性的目錄項,用以加快作業系統訪問檔案的效率。即核心中也會有FCB的內容,甚至目錄檔案也會存在記憶體中。
根據上面的背景知識其實就可以總結出建立根檔案系統的步驟,無非就是建立這些目錄和檔案,然後讓核心能夠認識它們(即在核心中掛載根檔案系統)。
具體步驟如下:
1、建立各個目錄和必須的檔案
1.1、建立空目錄:
#mkdir rootfs
#cd rootfs
#mkdir bin dev etc lib proc sbin sys usr mnt tmp var
#mkdir usr/bin usr/lib usr/sbin lib/modules
1.2、建立裝置檔案:建立Linux啟動需要的裝置驅動檔案:控制台和空
#cd rootfs/dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
1.3、加入設定檔:添加核心啟動的一些設定檔
#tar etc.tar.gz
#mv etc/* .../rootfs/etc/ -rf
1.4、添加核心模組:
#cd .../linux
#make modules ARCH=arm CROSS_COMPILE=arm-linux-
#make modules_install ARCH=arm INSTALL_MOD_PATH=.../rootfs
1.5、編譯/安裝busybox:使用busybox添加常用的命令如cd、ls、date等等
#make menuconfig
#make
#make install
2、掛載根檔案系統:事實上掛載根檔案系統就是完成指明根檔案系統放在何處、作業系統如何使用檔案系 統的目錄檔案等等工作。這裡介紹一個基於記憶體的掛載方式,即根檔案系統在編譯後直接整合在核心代碼中,隨著代碼被載入到記憶體中,核心啟動過程中可以直接使用檔案系統。initramfs檔案系統的製作:
2.1、#cd .../rootfs/
#ln -s ./bin/busybox init
2.2、 配置核心,讓核心知道檔案系統的掛載方式是initramfs。
2.3、編譯核心
2.4、設定uboot參數:
setenv bootargs noinitrd console=ttySAC0,115200
完成上面的工作就可以製作成一個擁有initramfs 檔案系統的完整的Linux系統。
至此一個完整的Linux系統就已經能夠在mini2440中運行,接下來就可以在其上進行驅動或者應用開發。
ARM開發板系統移植-----rootfs的製作