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

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

相位噪聲分析儀的技術(shù)原理和應(yīng)用
數(shù)字通信分析儀的技術(shù)原理和應(yīng)用
電池(包級(jí))測(cè)試系統(tǒng)的技術(shù)原理和應(yīng)用
Cadence推出基于Arm的系統(tǒng)Chiplet

導(dǎo)航分析儀的技術(shù)原理和應(yīng)用場(chǎng)景
ARM技術(shù)是什么?國(guó)內(nèi)有哪些ARM廠家呢?一起來(lái)了解一下!
Arm加入OpenCloudOS操作系統(tǒng)開(kāi)源社區(qū)
RISC-V和arm指令集的對(duì)比分析
NFC協(xié)議分析儀的技術(shù)原理和應(yīng)用場(chǎng)景
淺談邏輯分析儀的技術(shù)原理和應(yīng)用領(lǐng)域
Arm精銳超級(jí)分辨率技術(shù)解析

評(píng)論