根文件系统是构建一个 uCLinux 嵌入式系统的重要组成部分。目前嵌入式系统可以选择的根文件系统有:Romfs、CramFS、Ramfs、Jffs2、Ext2 等等,本系统采用 CramFS 作为 uCLinux 嵌入式系统的只读根文件系统。本文讨论了 CramFS 文件系统的特点,并详细的说明了 Nor Flash 上建立一个 uClinux 的 Cramfs 根文件系统的一般步骤。
一、引言
随着电子产业的不断发展,基于 ARM 技术的系统设计和开发平台越来越多地在控制类、消费类、通信类等电子产品中广泛应用。从软件角度上看,构建基于 ARM 技术的 uClinux 系统要涉及到引导加载程序、Linux 内核、文件系统、用户应用程序几部分的设计。
文件系统是操作系统中用来管理用户文件的内核软件层。文件可能存在于磁盘、网络或者是一些虚拟的文件。文件系统包括根文件系统和建立于内存设备之上文件系统。根文件系统是 uClinux 系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为存储数据读写结果的区域。由于嵌入式设备中 Flash 资源很紧张,如何有效地使用有限的存储空间是嵌入式开发者必须考虑的,合适的文件系统格式是解决这一问题的关键所在。本文讨论了只读压缩 CramFS 文件系统的特点,并详细的说明了 Nor Flash 上建立一个 uClinux 的 Cramfs 根文件系统的一般步骤。
二、开发环境简介
本系统采用的是宿主机+目标板的开发模式,宿主机为 PC+Cygwin1.5.1 ,目标板为采用 203MHz 的 ARM920T 内核的处理器 S3C2410x+uClinux, uClinux 版本为 2.4.18。在宿主机上将 uClinux 和应用程序编译后,下载到目标板的 Nor Flash 中,启动运行。使用的 SDRAM 是 2 片 16MB 的 HY57v561620,工作在 16bit 双字节模式下;使用的 Flash 是 2 片 AMD AM29LV160DB,大小为 2M 字节,工作在 16bit 双字节模式下。在开发的时候,将 Boot Loader 烧入 AM29LV160DB 的 1-5 扇区;将 Linux 内核映象文件 zImage 烧入 6-17 扇区;将 CramFS 文件系统映象文件烧入 18-35 扇区。
三、 Cramfs 文件系统简介
CramFS(Compressed Rom File System)是 Linux Torvalds 在 Transmeta 任职时,所参与开发的文件系统。它是针对 Linux 内核 2.4 之后的版本所设计的一种新型只读文件系统,采用了 zlib 压缩,压缩比一般可以达到 1:2,但仍可以作到高效的随机读取,Linux 系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为 Cramfs 不会影响系统的读取文件的速度,而且是一个高度压缩的文件系统。因此非常广泛应用于嵌入式系统中。
在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用 RAMDISK 方式来使用文件系统,那么在系统运行之后,首先要把 Flash 上的映像文件解压缩到内存中,构造起 RAMDISK 环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在 Flash 中占据了空间(以压缩后的形式存在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在),这违背了嵌入式环境下尽量节省资源的要求。
使用 CramFS 文件系统就是一种解决这个问题的方式。CramFS 是一个压缩格式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时候,马上计算出该数据在 CramFS 中的位置,将它实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS 中的解压缩以及解压缩之后的内存中数据存放位置都是由 CramFS 文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。
一个完整的 cramfs 文件系统通常包含以下几个目录:
/linuxrc 启动脚本文件,由 Boot Loader 核心命令行确定 init=/linuxrc,加载 /etc 目录为 ramfs,(cramfs 为只读文件系统),拷贝 /mnt/etc 到 /etc,配置文件目录重新加载根文件系统和 /etc 文件系统,执行 init 进程。
/bin 引导启动所需的命令或用户可能用的命令。
/sbin 系统管理员服务程序,其中最重要的是供内核初始化之后执行的 /sbin/init 进程,系统启动时由 init 解释并运行 /etc/inittab, inittab 将指导 int 去调用一个系统初始化程序 /etc/init.d/rcS。
/etc 特定机器的配置文件以及用户数据存放目录,其中的所有内容是在内核运行后,由 linuxrc 从 /mnt/etc 拷贝得到的。
/lib 文件系统上的程序所需的动态库。
/dev 驱动程序存放目录,可以在这里存放自己编写的驱动程序。
/usr 用于存放用户程序和配置文件的目录,可以根据需要进行设置。目录下的 /usr/etc/rc.local 执行本地所需要的初始化,如安装核心模块,进行网络,运行应用程序,启动图形界面等。/etc/modules.conf 在系统运行期间自动加载模块。
/mnt 用于设备安装的目录。/mnt/etc/init.d/rcS 完成各个文件系统的 Mount,执行 /usr/etc/rc.local;通过 rcS 可以调动 dhcp 程序配置网络。rcS 执行完以后,就会打开 Shell。
/proc 系统状态文件目录, 目录中的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。尽管 /proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像‘more’, ‘less’或 ‘cat’这样的程序来查看。
四、 Cramfs 文件系统的移植过程
文件系统是紧跟 uCLinux 内核放置,由内核加载,主要存放用户应用程序和配置信息。CramFS 文件系统的基本组成:初始化程序、Shell 程序以及其他 Linux 常用工具、配置文件、链接库、图形界面程序和用户应用程序等。本节将介绍移植 CramFS 文件系统的具体操作方法。
4.1、在内核中加入对 CramFS 文件系统支持
想要在系统中提供 CramFS 的能力,我们必须要在编辑 uCliunx 内核时把支持 CramFS 的选项加入。尽管 uCLinux 可以以模块的形式加载各种类型的设备驱动上,但我们选择直接把设备驱动及 CramFS 文件系统静态地编译进内核中。
在 Memory Technology Devices (MTD)选项中进行配置:
Memory Technology device (MTD) support[Y/m/n/?] Y 内存技术设备支持
MTD partitioning support [Y/m/n/?] Y 支持 MTD 分区
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 文件系统的支持
完成上述修改并编译后,完成 uCliunx 内核对 CramFS 文件系统的支持。
4.2、拷贝需要加入的其他文件和链接库
(1)、Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先开发的。Busybox 编译出一个单个的独立执行程序,就叫做 busybox。但是它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序的功能。这其中包括有一个迷你的 vi 编辑器,系统不可或缺的 /sbin/init 程序,以及其他诸如 ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat 等等。而所有这一切功能却只有区区 1M 左右的大小,Busybox 已经成为构建嵌入式 Linux 文件系统的必备软件。
首先我们从官方网站(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 编译成静态链接的可执行文件,运行时才独立于其他函数库,否则必需要其他库文件才能运行,在单个 linux 内核不能使他正常工作。
Do you want to build BusyBox with a Cross Compiler
选择你自己定义的交叉编译环境。
installation Options
don’t use /usr
这个选项也一定要选,否则 make install 后 busybox 将安装在原系统的 /usr 下,这将覆盖系统原有的命令。选择这个选项后,make install 后会在 busybox 目录下生成一个叫 _install 的目录,里面有 busybox 和指向他的链接。
其他选项都是一些 linux 基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了,配置好后退出并保存。编译 BusyBox,如果能成功编译 BusyBox,就将编译好的 busybox 复制到 CramFS 文件系统的 /bin 目录下,然后创建常用命令的建立快捷方式。建立快捷方式很简单,只要建一个符号链接,比方 ln -s /bin/busybox /bin/ls,那么,执行 /bin/ls 的时候,busybox 就会执行 ls 的功能,也会按照 ls 的方式处理命令行参数。
(2)、拷贝一些管理员控制程序到 /sbin 目录下,最重要的就是要包含一个 init 命令,可以使用 busybox 提供的系统工具。比如 ln -s /bin/busybox /sbin/init,这样我们就有了系统运行不可或缺的 /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 压缩文件系统
一般情况下都要把已经规划好的目录结构转换成一个映象文件,创建 Cramfs 文件系统需要 mkcramfs 工具,mkcramfs 能把相应的 Cramfs 目录树压缩成为单一的映象文件,这个映象文件就是我们需要移植的文件系统。Mkcramfs 的命令格式为:
Mkcramfs [-h] [--e edition] [-I file] [-n name] DirName OutFile
#mkcramfs root cramfs.Img
用以上的命令就可以生成我们需要的 cramfs 文件系统映象文件,我们可以发现原本为 2.36Mbytes 大小的目录内容,被压缩成一个 1.08Mbytes 的 CramFS 文件系统映象文件, 通过 vivi 或测试程序将其写入 Flash 中就可以验证是否移植成功。
五、小结
CramFS 是一个压缩格式的文件系统,如果系统存储资源比较紧张的话,采用 CramFS 作为嵌入式 Linux 系统的根文件系统是一个不错的选择。
审核编辑 黄昊宇
-
ARM
+关注
关注
135文章
9499浏览量
388799 -
uClinux
+关注
关注
3文章
75浏览量
43921
发布评论请先 登录
Arm神经技术是业界首创在 Arm GPU 上增添专用神经加速器的技术,移动设备上实现PC级别的AI图形性能
ARM Mali GPU 深度解读
Arm 公司面向 PC 市场的 Arm Niva 深度解读
Arm 公司面向移动端市场的 Arm Lumex 深度解读
Arm 公司面向汽车市场的 Arm Zena 深度解读
光频谱分析仪的技术原理和应用场景
信号源分析仪的技术原理和应用场景
Arm发布芯粒系统架构首个公开规范
Arm 技术预测:2025 年及未来的技术趋势
利用Arm Kleidi技术实现PyTorch优化

基于ARM技术的uClinux系统设计与应用分析
评论