根文件系統(tǒng)是構建一個 uCLinux 嵌入式系統(tǒng)的重要組成部分。目前嵌入式系統(tǒng)可以選擇的根文件系統(tǒng)有:Romfs、CramFS、Ramfs、Jffs2、Ext2 等等,本系統(tǒng)采用 CramFS 作為 uCLinux 嵌入式系統(tǒng)的只讀根文件系統(tǒng)。本文討論了 CramFS 文件系統(tǒng)的特點,并詳細的說明了 Nor Flash 上建立一個 uClinux 的 Cramfs 根文件系統(tǒng)的一般步驟。
一、引言
隨著電子產業(yè)的不斷發(fā)展,基于 ARM 技術的系統(tǒng)設計和開發(fā)平臺越來越多地在控制類、消費類、通信類等電子產品中廣泛應用。從軟件角度上看,構建基于 ARM 技術的 uClinux 系統(tǒng)要涉及到引導加載程序、Linux 內核、文件系統(tǒng)、用戶應用程序幾部分的設計。
文件系統(tǒng)是操作系統(tǒng)中用來管理用戶文件的內核軟件層。文件可能存在于磁盤、網絡或者是一些虛擬的文件。文件系統(tǒng)包括根文件系統(tǒng)和建立于內存設備之上文件系統(tǒng)。根文件系統(tǒng)是 uClinux 系統(tǒng)的核心部分,包含系統(tǒng)使用的軟件和庫,以及所有用來為用戶提供支持架構和用戶使用的應用軟件,并作為存儲數(shù)據讀寫結果的區(qū)域。由于嵌入式設備中 Flash 資源很緊張,如何有效地使用有限的存儲空間是嵌入式開發(fā)者必須考慮的,合適的文件系統(tǒng)格式是解決這一問題的關鍵所在。本文討論了只讀壓縮 CramFS 文件系統(tǒng)的特點,并詳細的說明了 Nor Flash 上建立一個 uClinux 的 Cramfs 根文件系統(tǒng)的一般步驟。
二、開發(fā)環(huán)境簡介
本系統(tǒng)采用的是宿主機+目標板的開發(fā)模式,宿主機為 PC+Cygwin1.5.1 ,目標板為采用 203MHz 的 ARM920T 內核的處理器 S3C2410x+uClinux, uClinux 版本為 2.4.18。在宿主機上將 uClinux 和應用程序編譯后,下載到目標板的 Nor Flash 中,啟動運行。使用的 SDRAM 是 2 片 16MB 的 HY57v561620,工作在 16bit 雙字節(jié)模式下;使用的 Flash 是 2 片 AMD AM29LV160DB,大小為 2M 字節(jié),工作在 16bit 雙字節(jié)模式下。在開發(fā)的時候,將 Boot Loader 燒入 AM29LV160DB 的 1-5 扇區(qū);將 Linux 內核映象文件 zImage 燒入 6-17 扇區(qū);將 CramFS 文件系統(tǒng)映象文件燒入 18-35 扇區(qū)。
三、 Cramfs 文件系統(tǒng)簡介
CramFS(Compressed Rom File System)是 Linux Torvalds 在 Transmeta 任職時,所參與開發(fā)的文件系統(tǒng)。它是針對 Linux 內核 2.4 之后的版本所設計的一種新型只讀文件系統(tǒng),采用了 zlib 壓縮,壓縮比一般可以達到 1:2,但仍可以作到高效的隨機讀取,Linux 系統(tǒng)中,通常把不需要經常修改的目錄壓縮存放,并在系統(tǒng)引導的時候再將壓縮文件解開。因為 Cramfs 不會影響系統(tǒng)的讀取文件的速度,而且是一個高度壓縮的文件系統(tǒng)。因此非常廣泛應用于嵌入式系統(tǒng)中。
在嵌入式的環(huán)境之下,內存和外存資源都需要節(jié)約使用。如果使用 RAMDISK 方式來使用文件系統(tǒng),那么在系統(tǒng)運行之后,首先要把 Flash 上的映像文件解壓縮到內存中,構造起 RAMDISK 環(huán)境,才可以開始運行程序。但是它也有很致命的弱點。在正常情況下,同樣的代碼不僅在 Flash 中占據了空間(以壓縮后的形式存在),而且還在內存中占用了更大的空間(以解壓縮之后的形式存在),這違背了嵌入式環(huán)境下盡量節(jié)省資源的要求。
使用 CramFS 文件系統(tǒng)就是一種解決這個問題的方式。CramFS 是一個壓縮格式的文件系統(tǒng),它并不需要一次性地將文件系統(tǒng)中的所有內容都解壓縮到內存之中,而只是在系統(tǒng)需要訪問某個位置的數(shù)據的時候,馬上計算出該數(shù)據在 CramFS 中的位置,將它實時地解壓縮到內存之中,然后通過對內存的訪問來獲取文件系統(tǒng)中需要讀取的數(shù)據。CramFS 中的解壓縮以及解壓縮之后的內存中數(shù)據存放位置都是由 CramFS 文件系統(tǒng)本身進行維護的,用戶并不需要了解具體的實現(xiàn)過程,因此這種方式增強了透明度,對開發(fā)人員來說,既方便,又節(jié)省了存儲空間。
一個完整的 cramfs 文件系統(tǒng)通常包含以下幾個目錄:
/linuxrc 啟動腳本文件,由 Boot Loader 核心命令行確定 init=/linuxrc,加載 /etc 目錄為 ramfs,(cramfs 為只讀文件系統(tǒng)),拷貝 /mnt/etc 到 /etc,配置文件目錄重新加載根文件系統(tǒng)和 /etc 文件系統(tǒng),執(zhí)行 init 進程。
/bin 引導啟動所需的命令或用戶可能用的命令。
/sbin 系統(tǒng)管理員服務程序,其中最重要的是供內核初始化之后執(zhí)行的 /sbin/init 進程,系統(tǒng)啟動時由 init 解釋并運行 /etc/inittab, inittab 將指導 int 去調用一個系統(tǒng)初始化程序 /etc/init.d/rcS。
/etc 特定機器的配置文件以及用戶數(shù)據存放目錄,其中的所有內容是在內核運行后,由 linuxrc 從 /mnt/etc 拷貝得到的。
/lib 文件系統(tǒng)上的程序所需的動態(tài)庫。
/dev 驅動程序存放目錄,可以在這里存放自己編寫的驅動程序。
/usr 用于存放用戶程序和配置文件的目錄,可以根據需要進行設置。目錄下的 /usr/etc/rc.local 執(zhí)行本地所需要的初始化,如安裝核心模塊,進行網絡,運行應用程序,啟動圖形界面等。/etc/modules.conf 在系統(tǒng)運行期間自動加載模塊。
/mnt 用于設備安裝的目錄。/mnt/etc/init.d/rcS 完成各個文件系統(tǒng)的 Mount,執(zhí)行 /usr/etc/rc.local;通過 rcS 可以調動 dhcp 程序配置網絡。rcS 執(zhí)行完以后,就會打開 Shell。
/proc 系統(tǒng)狀態(tài)文件目錄, 目錄中的文件可以用于訪問有關內核的狀態(tài)、計算機的屬性、正在運行的進程的狀態(tài)等信息。盡管 /proc 中的文件是虛擬的,但它們仍可以使用任何文件編輯器或像‘more’, ‘less’或 ‘cat’這樣的程序來查看。
四、 Cramfs 文件系統(tǒng)的移植過程
文件系統(tǒng)是緊跟 uCLinux 內核放置,由內核加載,主要存放用戶應用程序和配置信息。CramFS 文件系統(tǒng)的基本組成:初始化程序、Shell 程序以及其他 Linux 常用工具、配置文件、鏈接庫、圖形界面程序和用戶應用程序等。本節(jié)將介紹移植 CramFS 文件系統(tǒng)的具體操作方法。
4.1、在內核中加入對 CramFS 文件系統(tǒng)支持
想要在系統(tǒng)中提供 CramFS 的能力,我們必須要在編輯 uCliunx 內核時把支持 CramFS 的選項加入。盡管 uCLinux 可以以模塊的形式加載各種類型的設備驅動上,但我們選擇直接把設備驅動及 CramFS 文件系統(tǒng)靜態(tài)地編譯進內核中。
在 Memory Technology Devices (MTD)選項中進行配置:
Memory Technology device (MTD) support[Y/m/n/?] Y 內存技術設備支持
MTD partitioning support [Y/m/n/?] Y 支持 MTD 分區(qū)
Direct char device access to MTD devices[Y/m/n/?] Y MTD 字符設備直接訪問
Caching block device access to MTD devices[Y/m/n/?] Y MTD 塊設備緩沖訪問
在 File systems 選項中進行配置:
Compressed ROM file system support [Y/m/n/?] Y ROM 文件系統(tǒng)的支持
完成上述修改并編譯后,完成 uCliunx 內核對 CramFS 文件系統(tǒng)的支持。
4.2、拷貝需要加入的其他文件和鏈接庫
(1)、Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先開發(fā)的。Busybox 編譯出一個單個的獨立執(zhí)行程序,就叫做 busybox。但是它可以根據配置,執(zhí)行 ash shell 的功能,以及幾十個各種小應用程序的功能。這其中包括有一個迷你的 vi 編輯器,系統(tǒng)不可或缺的 /sbin/init 程序,以及其他諸如 ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat 等等。而所有這一切功能卻只有區(qū)區(qū) 1M 左右的大小,Busybox 已經成為構建嵌入式 Linux 文件系統(tǒng)的必備軟件。
首先我們從官方網站(http://www.busybox.org/)上下載 BusyBox 的版本 1.0.0。
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig
下面是需要編譯進 busybox 的功能選項,其他的可以根據需要自選。
Build Options
Build BusyBox as a static binary (no shared libs)
這個選項是一定要選擇的,這樣才能把 busybox 編譯成靜態(tài)鏈接的可執(zhí)行文件,運行時才獨立于其他函數(shù)庫,否則必需要其他庫文件才能運行,在單個 linux 內核不能使他正常工作。
Do you want to build BusyBox with a Cross Compiler
選擇你自己定義的交叉編譯環(huán)境。
installation Options
don’t use /usr
這個選項也一定要選,否則 make install 后 busybox 將安裝在原系統(tǒng)的 /usr 下,這將覆蓋系統(tǒng)原有的命令。選擇這個選項后,make install 后會在 busybox 目錄下生成一個叫 _install 的目錄,里面有 busybox 和指向他的鏈接。
其他選項都是一些 linux 基本命令選項,自己需要哪些命令就編譯進去,一般用默認的就可以了,配置好后退出并保存。編譯 BusyBox,如果能成功編譯 BusyBox,就將編譯好的 busybox 復制到 CramFS 文件系統(tǒng)的 /bin 目錄下,然后創(chuàng)建常用命令的建立快捷方式。建立快捷方式很簡單,只要建一個符號鏈接,比方 ln -s /bin/busybox /bin/ls,那么,執(zhí)行 /bin/ls 的時候,busybox 就會執(zhí)行 ls 的功能,也會按照 ls 的方式處理命令行參數(shù)。
(2)、拷貝一些管理員控制程序到 /sbin 目錄下,最重要的就是要包含一個 init 命令,可以使用 busybox 提供的系統(tǒng)工具。比如 ln -s /bin/busybox /sbin/init,這樣我們就有了系統(tǒng)運行不可或缺的 /sbin/init 程序了。
(3)、拷貝應用程序運行時所需要的庫到 /lib,庫文件可以從 PC 機上的交叉編譯工具安裝目錄下拷貝,如 libc-2.2.2.so、libcryt-2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so 等,為部分相應庫建立快捷方式,提供一些應用程序按快捷方式名稱調用。值得注意的是 C 庫要采用 C 庫的版本 glibc, glibc 位于 /lib/libc.so.6。
4.3 、利用 mkcramfs 工具生成 cramfs 壓縮文件系統(tǒng)
一般情況下都要把已經規(guī)劃好的目錄結構轉換成一個映象文件,創(chuàng)建 Cramfs 文件系統(tǒng)需要 mkcramfs 工具,mkcramfs 能把相應的 Cramfs 目錄樹壓縮成為單一的映象文件,這個映象文件就是我們需要移植的文件系統(tǒng)。Mkcramfs 的命令格式為:
Mkcramfs [-h] [--e edition] [-I file] [-n name] DirName OutFile
#mkcramfs root cramfs.Img
用以上的命令就可以生成我們需要的 cramfs 文件系統(tǒng)映象文件,我們可以發(fā)現(xiàn)原本為 2.36Mbytes 大小的目錄內容,被壓縮成一個 1.08Mbytes 的 CramFS 文件系統(tǒng)映象文件, 通過 vivi 或測試程序將其寫入 Flash 中就可以驗證是否移植成功。
五、小結
CramFS 是一個壓縮格式的文件系統(tǒng),如果系統(tǒng)存儲資源比較緊張的話,采用 CramFS 作為嵌入式 Linux 系統(tǒng)的根文件系統(tǒng)是一個不錯的選擇。
審核編輯 黃昊宇
-
ARM
+關注
關注
135文章
9558瀏覽量
392120 -
uClinux
+關注
關注
3文章
75瀏覽量
44018
發(fā)布評論請先 登錄
arm嵌入式主板優(yōu)缺點
ARM嵌入式這樣學
RDMA設計4:技術需求分析2
Arm SystemReady研討會圓滿召開
深入解析面向不同市場的多樣化Arm計算子系統(tǒng)
Arm神經技術是業(yè)界首創(chuàng)在 Arm GPU 上增添專用神經加速器的技術,移動設備上實現(xiàn)PC級別的AI圖形性能
雙電機驅動系統(tǒng)消隙技術分析
ARM Mali GPU 深度解讀
Arm 公司面向 PC 市場的 ?Arm Niva? 深度解讀
Arm 公司面向移動端市場的 ?Arm Lumex? 深度解讀
Arm 公司面向汽車市場的 ?Arm Zena? 深度解讀
電機微機控制系統(tǒng)可靠性分析
國產ARM主板:自主創(chuàng)新的崛起與未來挑戰(zhàn)
基于ARM技術的uClinux系統(tǒng)設計與應用分析
評論