嵌入式根檔案系統的移植和製作(一)
2. 基於ram的檔案系統
(1) ramdisk
ramdisk是將一部分固定大小的記憶體當作分割槽來使用。它並非乙個實際的檔案系統,而是一種將實際的檔案系統裝入記憶體的機制,並且可以作為根檔案系統。 將一些經常被訪問而又不會更改的檔案(如唯讀的根檔案系統)通過ramdisk放在記憶體中,可以明顯地提高系統的效能。
在linux的啟動階段,initrd提供了一套機制,可以將核心映像和根檔案系統一起載入記憶體。
(2)ramfs/tmpfs
ramfs是linus torvalds開發的一種基於記憶體的檔案系統,工作於虛擬檔案系統(vfs)層,不能格式化,可以建立多個,在建立時可以指定其最大能使用的記憶體大 小。(實際上,vfs本質上可看成一種記憶體檔案系統,它統一了檔案在核心中的表示方式,並對磁碟檔案系統進行緩衝。)
ramfs/tmpfs檔案系統把所有的檔案都放在ram中,所以讀/寫操作發生在ram中,可以用ramfs/tmpfs來儲存一些臨時性或經常要修改的資料,例如/tmp和/var目錄,這樣既避免了對flash儲存器的讀寫損耗,也提高了資料讀寫速度。
ramfs/tmpfs相對於傳統的ramdisk的不同之處主要在於:不能格式化,檔案系統大小可隨所含檔案內容大小變化。
tmpfs的乙個缺點是當系統重新引導時會丟失所有資料。
3. 網路檔案系統nfs (network file system)
nfs是由sun開發並發展起來的一項在不同機器、不同作業系統之間通過網路共享檔案的技術。在嵌入式linux系統的開發除錯階段,可以利用該技術在主機上建立基於nfs的根檔案系統,掛載到嵌入式裝置,可以很方便地修改根檔案系統的內容。
以上討論的都是基於儲存裝置的檔案系統(memory-based file system),它們都可用作linux的根檔案系統。實際上,linux還支援邏輯的或偽檔案系統(logical or pseudo file system),例如procfs(proc檔案系統),用於獲取系統資訊,以及devfs(裝置檔案系統)和sysfs,用於維護裝置檔案。
我們要移植的開發板的儲存裝置為nandflash,我們可以用應用比較廣泛的cramfs檔案系統。
二.移植準備
1.目標板
2.軟體準備
(1)busybox
busybox被形象的稱為嵌入式linux系統中的瑞士軍刀,可以從這個稱呼中看到busybox是乙個集多種功能於一身的東西,它將許多常用的 unix命令和工具結合到了乙個單獨的可執行程式中。雖然與相應的gnu工具比較起來,busybox所提供的功能和引數略少,但在比較小的系統(例如啟 動盤)或者嵌入式系統中,已經足夠了。
busybox在設計上就充分考慮了硬體資源受限的特殊工作環境。它採用一種很巧妙的辦法減少自己的體積:所有的命令都通過「外掛程式」的方式集中到乙個可執 行檔案中,在實際應用過程中通過不同的符號鏈結來確定到底要執行哪個操作。例如最終生成的可執行檔案為busybox,當為它建立乙個符號鏈結ls的時 候,就可以通過執行這個新命令實現列目錄的功能。採用單一執行檔案的方式最大限度地共享了程式**,甚至連檔案頭、記憶體中的程式控制塊等其他作業系統資源 都共享了,對於資源比較緊張的系統來說,真是最合適不過了。
在busybox的編譯過程中,可以非常方便地加減它的「外掛程式」,最後的符號鏈結也可以由編譯系統自動生成。
編譯busybox
busybox的編譯過程與核心的編譯過程很接近都是先make menuconfig進行配置,然後在make進行編譯。
解壓busybox-1.13.4.tar.bz2使用命令
tar jxvf busybox-1.13.4.tar.bz2
進入busybox目錄,修改makefile 在164行 cross_compile=arm-linux-
make menuconfig進行配置,可以選擇靜態編譯,如果是動態編譯的話要拷貝相應的庫檔案,預設配置儲存即可。
make all install
這是會在busybox目錄下生成_install資料夾。
(2)檔案系統打包工具
解壓cramfs-1.1.tar.gz使用命令:tar zxvf cramfs-1.1.tar.gz
進入cramfs工具的根目錄執行make。
make後在cramfs工具的根目錄中就會生成乙個mkcramfs檔案,這個就是我們需要的工具。
三.製作過程
1.建立根檔案系統目錄
就是之前busybox生成的_install目錄 cd …/_install
2.建立各種必要的系統檔案目錄。
mkdir dev lib tmp proc
3.建立裝置檔案。
cd dev
mknod fb0 c 29 0 建立framebuffer裝置檔案
mknod ts0 c 13 128 建立觸控螢幕裝置檔案
mknod console c 5 1
mknod tty0 c 4 0
mknod tty1 c 4 1
mknod tty2 c 4 2
mknod tty3 c 4 3
mknod tty4 c 4 4
4.新增必要的庫檔案,由於之前沒有選擇靜態編譯busybox,這裡要拷貝相應的庫檔案
cd lib
cp –arf …/arm-linux/lib/* .
5.根據自己需要新增應用程式
這裡我們編寫乙個簡單的應用程式列印一句問候語,程式**如下:
#include
void main()
注意編譯時要使用arm-linux-gcc,由於之前我們把編譯器的庫檔案全部進行拷貝,可以直接動態編譯。生成的可執行檔案hello放入tmp資料夾。使用的命令:
rm-linux-gcc hello.c –o hello
cp –arf …/_install/tmp/
6.打包
mkcramfs _install rootfs
嵌入式根檔案系統的移植和製作(三)
四 燒寫過程 我們採用的燒寫方法和燒寫核心的方法一樣核心的燒,我們採用tftp方式,用網線將目標板和pc機連線起來,配置好目標板的網路引數,主要是serverip ipaddr。按照之前核心的nandflash分割槽進行燒寫,將記憶體中的檔案系統燒寫到flash中 nand erase 500000...
製作嵌入式根檔案系統的錯誤分析
最近在移植linux核心時,發現我移植的initramfs無法正常掛載,出現的錯誤如下 關於這個錯誤的解決辦法,網上的說法基本呈現兩種 第一種是未對linux核心進行合適的配置,第二種是生成的檔案系統過大,而ram過小 1 第一種的解決方案是,在核心配置選單的kernel features 子選單中...
嵌入式linux核心與根檔案系統製作
製作嵌入式平台使用的linux核心,方法和製作pc平台的linux核心基本一致,下面使用對比的方法介紹如何製作用於mini2440開發板的核心。1 清除原有配置和中間檔案 x86 make distclean arm make distclean 2 配置核心 x86 make menuconfig...