根文件系統(tǒng)是構(gòu)建一個 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)的一般步驟。
一、引言
隨著電子產(chǎn)業(yè)的不斷發(fā)展,基于 ARM 技術(shù)的系統(tǒng)設(shè)計和開發(fā)平臺越來越多地在控制類、消費類、通信類等電子產(chǎn)品中廣泛應(yīng)用。從軟件角度上看,構(gòu)建基于 ARM 技術(shù)的 uClinux 系統(tǒng)要涉及到引導(dǎo)加載程序、Linux 內(nèi)核、文件系統(tǒng)、用戶應(yīng)用程序幾部分的設(shè)計。
文件系統(tǒng)是操作系統(tǒng)中用來管理用戶文件的內(nèi)核軟件層。文件可能存在于磁盤、網(wǎng)絡(luò)或者是一些虛擬的文件。文件系統(tǒng)包括根文件系統(tǒng)和建立于內(nèi)存設(shè)備之上文件系統(tǒng)。根文件系統(tǒng)是 uClinux 系統(tǒng)的核心部分,包含系統(tǒng)使用的軟件和庫,以及所有用來為用戶提供支持架構(gòu)和用戶使用的應(yīng)用軟件,并作為存儲數(shù)據(jù)讀寫結(jié)果的區(qū)域。由于嵌入式設(shè)備中 Flash 資源很緊張,如何有效地使用有限的存儲空間是嵌入式開發(fā)者必須考慮的,合適的文件系統(tǒng)格式是解決這一問題的關(guān)鍵所在。本文討論了只讀壓縮 CramFS 文件系統(tǒng)的特點,并詳細的說明了 Nor Flash 上建立一個 uClinux 的 Cramfs 根文件系統(tǒng)的一般步驟。
二、開發(fā)環(huán)境簡介
本系統(tǒng)采用的是宿主機+目標板的開發(fā)模式,宿主機為 PC+Cygwin1.5.1 ,目標板為采用 203MHz 的 ARM920T 內(nèi)核的處理器 S3C2410x+uClinux, uClinux 版本為 2.4.18。在宿主機上將 uClinux 和應(yīng)用程序編譯后,下載到目標板的 Nor Flash 中,啟動運行。使用的 SDRAM 是 2 片 16MB 的 HY57v561620,工作在 16bit 雙字節(jié)模式下;使用的 Flash 是 2 片 AMD AM29LV160DB,大小為 2M 字節(jié),工作在 16bit 雙字節(jié)模式下。在開發(fā)的時候,將 Boot Loader 燒入 AM29LV160DB 的 1-5 扇區(qū);將 Linux 內(nèi)核映象文件 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 內(nèi)核 2.4 之后的版本所設(shè)計的一種新型只讀文件系統(tǒng),采用了 zlib 壓縮,壓縮比一般可以達到 1:2,但仍可以作到高效的隨機讀取,Linux 系統(tǒng)中,通常把不需要經(jīng)常修改的目錄壓縮存放,并在系統(tǒng)引導(dǎo)的時候再將壓縮文件解開。因為 Cramfs 不會影響系統(tǒng)的讀取文件的速度,而且是一個高度壓縮的文件系統(tǒng)。因此非常廣泛應(yīng)用于嵌入式系統(tǒng)中。
在嵌入式的環(huán)境之下,內(nèi)存和外存資源都需要節(jié)約使用。如果使用 RAMDISK 方式來使用文件系統(tǒng),那么在系統(tǒng)運行之后,首先要把 Flash 上的映像文件解壓縮到內(nèi)存中,構(gòu)造起 RAMDISK 環(huán)境,才可以開始運行程序。但是它也有很致命的弱點。在正常情況下,同樣的代碼不僅在 Flash 中占據(jù)了空間(以壓縮后的形式存在),而且還在內(nèi)存中占用了更大的空間(以解壓縮之后的形式存在),這違背了嵌入式環(huán)境下盡量節(jié)省資源的要求。
使用 CramFS 文件系統(tǒng)就是一種解決這個問題的方式。CramFS 是一個壓縮格式的文件系統(tǒng),它并不需要一次性地將文件系統(tǒng)中的所有內(nèi)容都解壓縮到內(nèi)存之中,而只是在系統(tǒng)需要訪問某個位置的數(shù)據(jù)的時候,馬上計算出該數(shù)據(jù)在 CramFS 中的位置,將它實時地解壓縮到內(nèi)存之中,然后通過對內(nèi)存的訪問來獲取文件系統(tǒng)中需要讀取的數(shù)據(jù)。CramFS 中的解壓縮以及解壓縮之后的內(nèi)存中數(shù)據(jù)存放位置都是由 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 引導(dǎo)啟動所需的命令或用戶可能用的命令。
/sbin 系統(tǒng)管理員服務(wù)程序,其中最重要的是供內(nèi)核初始化之后執(zhí)行的 /sbin/init 進程,系統(tǒng)啟動時由 init 解釋并運行 /etc/inittab, inittab 將指導(dǎo) int 去調(diào)用一個系統(tǒng)初始化程序 /etc/init.d/rcS。
/etc 特定機器的配置文件以及用戶數(shù)據(jù)存放目錄,其中的所有內(nèi)容是在內(nèi)核運行后,由 linuxrc 從 /mnt/etc 拷貝得到的。
/lib 文件系統(tǒng)上的程序所需的動態(tài)庫。
/dev 驅(qū)動程序存放目錄,可以在這里存放自己編寫的驅(qū)動程序。
/usr 用于存放用戶程序和配置文件的目錄,可以根據(jù)需要進行設(shè)置。目錄下的 /usr/etc/rc.local 執(zhí)行本地所需要的初始化,如安裝核心模塊,進行網(wǎng)絡(luò),運行應(yīng)用程序,啟動圖形界面等。/etc/modules.conf 在系統(tǒng)運行期間自動加載模塊。
/mnt 用于設(shè)備安裝的目錄。/mnt/etc/init.d/rcS 完成各個文件系統(tǒng)的 Mount,執(zhí)行 /usr/etc/rc.local;通過 rcS 可以調(diào)動 dhcp 程序配置網(wǎng)絡(luò)。rcS 執(zhí)行完以后,就會打開 Shell。
/proc 系統(tǒng)狀態(tài)文件目錄, 目錄中的文件可以用于訪問有關(guān)內(nèi)核的狀態(tài)、計算機的屬性、正在運行的進程的狀態(tài)等信息。盡管 /proc 中的文件是虛擬的,但它們?nèi)钥梢允褂萌魏挝募庉嬈骰蛳瘛甿ore’, ‘less’或 ‘cat’這樣的程序來查看。
四、 Cramfs 文件系統(tǒng)的移植過程
文件系統(tǒng)是緊跟 uCLinux 內(nèi)核放置,由內(nèi)核加載,主要存放用戶應(yīng)用程序和配置信息。CramFS 文件系統(tǒng)的基本組成:初始化程序、Shell 程序以及其他 Linux 常用工具、配置文件、鏈接庫、圖形界面程序和用戶應(yīng)用程序等。本節(jié)將介紹移植 CramFS 文件系統(tǒng)的具體操作方法。
4.1、在內(nèi)核中加入對 CramFS 文件系統(tǒng)支持
想要在系統(tǒng)中提供 CramFS 的能力,我們必須要在編輯 uCliunx 內(nèi)核時把支持 CramFS 的選項加入。盡管 uCLinux 可以以模塊的形式加載各種類型的設(shè)備驅(qū)動上,但我們選擇直接把設(shè)備驅(qū)動及 CramFS 文件系統(tǒng)靜態(tài)地編譯進內(nèi)核中。
在 Memory Technology Devices (MTD)選項中進行配置:
Memory Technology device (MTD) support[Y/m/n/?] Y 內(nèi)存技術(shù)設(shè)備支持
MTD partitioning support [Y/m/n/?] Y 支持 MTD 分區(qū)
Direct char device access to MTD devices[Y/m/n/?] Y MTD 字符設(shè)備直接訪問
Caching block device access to MTD devices[Y/m/n/?] Y MTD 塊設(shè)備緩沖訪問
在 File systems 選項中進行配置:
Compressed ROM file system support [Y/m/n/?] Y ROM 文件系統(tǒng)的支持
完成上述修改并編譯后,完成 uCliunx 內(nèi)核對 CramFS 文件系統(tǒng)的支持。
4.2、拷貝需要加入的其他文件和鏈接庫
(1)、Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先開發(fā)的。Busybox 編譯出一個單個的獨立執(zhí)行程序,就叫做 busybox。但是它可以根據(jù)配置,執(zhí)行 ash shell 的功能,以及幾十個各種小應(yīng)用程序的功能。這其中包括有一個迷你的 vi 編輯器,系統(tǒng)不可或缺的 /sbin/init 程序,以及其他諸如 ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat 等等。而所有這一切功能卻只有區(qū)區(qū) 1M 左右的大小,Busybox 已經(jīng)成為構(gòu)建嵌入式 Linux 文件系統(tǒng)的必備軟件。
首先我們從官方網(wǎng)站(http://www.busybox.org/)上下載 BusyBox 的版本 1.0.0。
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig
下面是需要編譯進 busybox 的功能選項,其他的可以根據(jù)需要自選。
Build Options
Build BusyBox as a static binary (no shared libs)
這個選項是一定要選擇的,這樣才能把 busybox 編譯成靜態(tài)鏈接的可執(zhí)行文件,運行時才獨立于其他函數(shù)庫,否則必需要其他庫文件才能運行,在單個 linux 內(nèi)核不能使他正常工作。
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 復(fù)制到 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)、拷貝應(yīng)用程序運行時所需要的庫到 /lib,庫文件可以從 PC 機上的交叉編譯工具安裝目錄下拷貝,如 libc-2.2.2.so、libcryt-2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so 等,為部分相應(yīng)庫建立快捷方式,提供一些應(yīng)用程序按快捷方式名稱調(diào)用。值得注意的是 C 庫要采用 C 庫的版本 glibc, glibc 位于 /lib/libc.so.6。
4.3 、利用 mkcramfs 工具生成 cramfs 壓縮文件系統(tǒng)
一般情況下都要把已經(jīng)規(guī)劃好的目錄結(jié)構(gòu)轉(zhuǎn)換成一個映象文件,創(chuàng)建 Cramfs 文件系統(tǒng)需要 mkcramfs 工具,mkcramfs 能把相應(yīng)的 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 大小的目錄內(nèi)容,被壓縮成一個 1.08Mbytes 的 CramFS 文件系統(tǒng)映象文件, 通過 vivi 或測試程序?qū)⑵鋵懭?Flash 中就可以驗證是否移植成功。
五、小結(jié)
CramFS 是一個壓縮格式的文件系統(tǒng),如果系統(tǒng)存儲資源比較緊張的話,采用 CramFS 作為嵌入式 Linux 系統(tǒng)的根文件系統(tǒng)是一個不錯的選擇。
審核編輯 黃昊宇
-
ARM
+關(guān)注
關(guān)注
135文章
9450瀏覽量
385734 -
uClinux
+關(guān)注
關(guān)注
3文章
75瀏覽量
43813
發(fā)布評論請先 登錄
深入解析面向不同市場的多樣化Arm計算子系統(tǒng)

雙電機驅(qū)動系統(tǒng)消隙技術(shù)分析
ARM Mali GPU 深度解讀
Arm 公司面向 PC 市場的 ?Arm Niva? 深度解讀
Arm 公司面向移動端市場的 ?Arm Lumex? 深度解讀
Arm 公司面向汽車市場的 ?Arm Zena? 深度解讀
光頻譜分析儀的技術(shù)原理和應(yīng)用場景
Arm 技術(shù)預(yù)測:2025 年及未來的技術(shù)趨勢

利用Arm Kleidi技術(shù)實現(xiàn)PyTorch優(yōu)化

相位噪聲分析儀的技術(shù)原理和應(yīng)用
數(shù)字通信分析儀的技術(shù)原理和應(yīng)用
Cadence推出基于Arm的系統(tǒng)Chiplet

評論