APP下载

MPC8349E平台的CRAMFS+JFFS2文件系统设计

2017-01-05陈选育赵斌锋邓易东程明覃波

单片机与嵌入式系统应用 2016年12期
关键词:源码脚本内核

陈选育,赵斌锋,邓易东,程明,覃波

(中国电子科技集团公司第三十四研究所,桂林 541004)



MPC8349E平台的CRAMFS+JFFS2文件系统设计

陈选育,赵斌锋,邓易东,程明,覃波

(中国电子科技集团公司第三十四研究所,桂林 541004)

首先论述了在MPC8349E平台引入CRAMFS+JFFS2两种文件系统的必要性,然后介绍了两种嵌入式文件系统开发工具LTIB和BusyBox,通过这两种工具的配合使用,提供了一种嵌入式Linux文件系统CRAMFS+JFFS2的设计方案,并基于此方案实现LED控制程序的自启动,最后验证了该嵌入式文件系统的运行状况。

MPC8349E;CRAMFS+JFFS2;嵌入式文件系统;控制程序

引 言

自1991年Linux操作系统诞生后,其应用越来越广泛,这得益于其开源性。与普通的商用实时操作系统相比,Linux操作系统资源是免费的,从底层的设备驱动程序到上层的图形界面环境均可通过互联网获取[1];可任意裁减,很适合在不同平台间移植,缩短了软件的开发周期;高度的模块化使得添加更容易、更方便;通过其本身不断的完善和提高,支持的处理器种类有PowerPC、ARM、Sparc、MIPS和x86等,使其在嵌入式方面获得长足的发展。

文件系统是Linux操作系统重要的组成部分,用于管理外部存储设备上的文件,并为操作系统和用户提供文件的存取、共享和保护等功能[2]。目前,在嵌入式Linux系统设计中,文件系统常存储于Flash存储器,主要的文件系统类型包括JFFS2、YAFFS2、CRAMFS、ROMFS、RAMDISK等[3],往往将CRAMFS、JFFS2文件系统用于NOR Flash,YAFFS文件系统用于NAND Flash。由于MPC8349E-mitx的开发板NOR Flash存储空间有限且仅提供单个的CRAMFS根文件系统,它是只读的、不具有可写性,而实际应用中除了根文件系统外,还需要具有可读写、掉电保护等功能的其他文件系统,保证系统掉电时数据也不会丢失,故需两个或多个文件系统搭配使用。考虑到JFFS2文件系统一般适合NOR Flash,CRAMFS文件系统具有2:1的压缩比和只读性,且读取速度快,很适合作为受保护的根文件系统使用。综合两种文件系统特点及开发板存储器的容量,本文提供了一种实现“CRAMFS+JFFS2”的文件系统解决方案,并通过该文件系统自启动LED指示灯控制程序。

1 开发环境

1.1 开发平台

基于MPC8349E-mitx的硬件平台,该平台的最小系统使用飞思卡尔PowerPC MPC8349E处理器,主频为667 MHz,外围存储芯片包括2片8 MB NOR Flash和4片64 MB DDR1 RAM。系统采用宿主机加目标板的模式,宿主机是PC机,其操作系统是Vmare-workstation6.0+Red Hat Enterprise 9.0 Linux 2.6.9-5.EL,目标板是基于MPC8349E的开发板,采用的内核是嵌入式Linux2.6.13,Boot loader是U-Boot1.1.3。

本设计制作文件系统采用两种工具,分别为LTIB(Linux Target Image Builder)和BusyBox。LTIB是飞思卡尔公司开发的一个使用在不同的目标平台下,用于开发和部署BSP(Board Support Packages)的简单工具。使用该工具,用户能够为其目标平台开发符合GNU/Linux标准的映像。LTIB支持PPC、ARM、Coldfire等多种目标架构,包含超过200个用户使用的工具包以及通用跨平台的根文件系统。LTIB支持Boot loader和内核映像的构建,编译时可对交叉编译工具进行选择,支持RAMDISK和JFFS2 Flash映像的创建。BusyBox是一个开源项目,遵循GPL V2协议,集成了一百多个最常用Linux命令和工具集。它与GNU工具相比,所提供的选项比较少,具有实用、短小、稳定等特点,主要应用于嵌入式系统[4]。本设计选择使用飞思卡尔公司提供的LTIB.tar.gz集成源码包,版本为LTIB 1.24 $,BusyBox源码版本为BusyBox1.21.2。

在使用过程中需要LTIB和BusyBox两种工具相互配合,LTIB主要负责进行内核配置、编译,构建内核和文件系统映像,BusyBox负责制作Linux常用的命令和工具,这是由于用LTIB做好的文件系统有些命令和工具缺失,导致某些应用程序可能无法启动,需要用BusyBox制作好的可执行文件替代LTIB文件系统下相应的目录,它是对LTIB所制作文件系统一些命令和工具的补充。

1.2 工具包安装、编译

BusyBox的软件包编译、安装较简单,相关参考文献也比较多,本文不再叙述。下面仅介绍LTIB工具的安装过程,具体步骤如下:

① 首先切换到root用户,复制源码到指定目录(一般在用户自己的目录下)。

$su-root ## 切换身份到root用户,需要root用户密码

# mount /dev/cdrom/mnt/cdrom-o loop ## 挂载光驱##copy到cxy(新建用户cxy,根据用户名不同更改)的主目录下

#cp-rf /mnt/cdrom/LTIB-mpc8349e-mitx/home/cxy/

② 创建安装目录。

#mkdir-m 777 /usr/local/mpc8349

## 创建安装LTIB的根目录

③ 修改普通用户权限。由于安装LTIB需要是普通用户身份,但部分命令要超级用户权限才行,所以需要执行vi增加用户cxy的权限。

# /usr/sbin/visudo(或直接用vi命令)## 此命令相对于vi打开了一个权限设置文件##按i进入输入模式,在最后一行添加如下一行内容

cxy ALL=NOPASSWD: /bin/rpm,/opt/freescale/LTIB/usr/bin/rpm

## 按ESC进入命令行模式,按:wq保存退出

$ exit## 退出root,回到普通用户身份cxy

④ 进入安装目录,开始安装LTIB。

$ /home/cxy/LTIB-mpc8349e-mitx/install ##安装完以后,默认的交叉编译环境为X86

⑤ 建立交叉编译环境。在内核配置中需配置交叉编译工具库,一般有两种库供选择,分别为glibc库和uclibc库,可根据需要选择,本设计采用uclibc库,具体配置如下:

#vi /etc/bashrc

在最后添加一句:

export PATH=/opt/freescale/usr/local/gcc-3.4.3-uClibc-0.9.28-1/powerpc-linux/bin:$PATH

安装完重启后,用#echo $PATH来查看环境变量设置是否有/opt/freescale/usr/local/gcc-3.4.3-uClibc-0.9.28-1/powerpc-linux/bin路径变量[5]。设置好环境变量后,就可以对目标板内核进行配置和编译了,所用的编译命令为:

./ltib-preconfig config/platform/mpc8349itx/defconfig-min-fs

2 CRAMFS+JFFS2文件系统的实现过程

文件系统实现过程,需依赖内存技术设备(Memory Technology Device,MTD)技术。MTD是Linux内核专门为Flash存储器开发的驱动程序子系统,该子系统是在Flash硬件驱动和上层文件系统之间提供了一个抽象的接口,支持JFFS2、CRAMFS文件系统,主要负责完成Flash存储器或其他设备驱动的一些通用工作,而Flash底层硬件驱动只需要在MTD驱动子系统注册即可,其他由MTD来完成[6]。通过这种设计方式,统一和简化了复杂的Flash存储器驱动的设计。对开发者而言,首先需要在内核源码中根据自己的需求修改MTD分区表,然后进行内核编译和MTD选项的配置。

2.1 修改和配置MTD驱动程序

(1) 修改MTD分区表

MTD分区信息在内核源码drivers/mtd/maps/amdnor.c文件中可以发现,如果没有,可以参照其他NOR Flash文件分区代码进行修改。在这个文件里,需定义Flash芯片的首地址、存储大小、分区表信息(包括逻辑地址和大小),并将芯片名称、存储大小、位宽等填入到一个struct map_info flagadm_map类型的结构中,同时将分区表信息填入到一个struct flagadm_parts类型的结构数组中,分区信息代码如下所示:

#define FLASH_PHYS_ADDR 0xfe000000

#define FLASH_SIZE 0x01000000

#define FLASH_PARTITION0_ADDR 0x00f00000

#define FLASH_PARTITION0_SIZE 0x00050000

#define FLASH_PARTITION1_ADDR 0x00810000

#define FLASH_PARTITION1_SIZE 0x001F0000

#define FLASH_PARTITION2_ADDR 0x00a00000

#define FLASH_PARTITION2_SIZE 0x00500000

#define FLASH_PARTITION3_ADDR 0x00010000

#define FLASH_PARTITION3_SIZE 0x007F0000

struct map_info flagadm_map = {

.name ="FlagaDM flash device",

.size =FLASH_SIZE,

.bankwidth =2,

};

struct mtd_partition flagadm_parts[] = {

{

.name ="Boot loader",

.offset=FLASH_PARTITION0_ADDR,

.size =FLASH_PARTITION0_SIZE

},

{

.name ="Kernel image",

.offset =FLASH_PARTITION1_ADDR,

.size =FLASH_PARTITION1_SIZE

},

{

.name ="Initial ramdisk image",

.offset =FLASH_PARTITION2_ADDR,

.size =FLASH_PARTITION2_SIZE

},

{

.name ="Persistant storage",

.offset =FLASH_PARTITION3_ADDR,

.size =FLASH_PARTITION3_SIZE

}

};

接下来,在Flash芯片驱动的模块初始化时,通过调用ioremap函数将Flash首地址映射成逻辑地址,然后调用add_mtd_partitions函数实现分区表的创建和注册。

本设计中,系统NOR Flash分4个区,数组的每一项对应一个MTD block设备,即每个FLASH_PARTITION分区对应一个MTD block设备,MTD block0为U-Boot引导区,MTD block1为内核区,MTD block2为CRAMFS根文件系统区,MTD block3为JFFS2文件系统区。需要注意的是,必须把用作根目录的设备作为启动参数传递给内核。如果根文件系统区发生变更,由MTD block2改为MTD block1,仅需更改U-Boot中启动参数bootargs的root项,将其改为root=/dev/mtdblock1即可,其他设置不用变动。

(2) 配置MTD

在修改完系统分区代码后,在编译内核时需要对Memory Technology Devices (MTD)选项进行配置,必须有Memory Technology Device (MTD) support、MTD partitioning support、Command line partition table parsing、Caching block device access to MTD devices和Mapping drivers for chip acces->HH_NOR_FLASH_SUPPORT支持,其配置界面如图1所示,其他配置不再详细叙述。

图1 MTD配置界面

用LTIB工具编译完内核后,会生成内核映像、rootfs文件系统及其映像。对于生成的文件系统及映像,还需要用BusyBox工具进行完善,BusyBox配置界面如图2所示。在配置前需要设置交叉编译工具前缀CONFIG_CROSS_COMPILER_PREFIX为powerpc-linux-,确保源码在PC环境下编译。

图2 BusyBox配置界面

配置编译完成后,会在其安装目录下生成_install目录,将该目录下bin、sbin、usr目录及linuxrc文件替换原来rootfs目录下相应的目录及文件,替换完后进行下一步系统启动脚本配置。

2.2 配置系统启动脚本

Linux内核启动完后,首先执行根目录下的linuxrc[7],linuxrc是系统启动时在内存执行的启动脚本,用于加载模块驱动、挂载文件系统、创建文件夹等。它是/bin/busybox的符号连接,执行到脚本最后一行命令“exec /sbin/init”后,跳转到init进程,init进程读取/etc/inittab脚本文件中的设置,开始进行系统初始化进程。对inittab脚本进行解析可知,一般init进程会依次执行系统启动时执行的脚本—>打开一个登录会话—>指定当按下ctrl+alt+del键执行的命令—>关机时执行的操作—>系统重启动时执行的命令。其中,系统启动时运行/etc/rc.d/rcs脚本,该脚本设置各种应用程序开机后自启动,也可进行其他设置,如设置主机名称、网络接口和IP地址等。本设计对rcs脚本进行修改,添加如下内容:

if [ $mode = "start" ]

then

if [ -x /etc/config/config.sh ]

then

/etc/config/config.sh

fi

fi

这里调用了/etc/config/config.sh配置文件,用来实现对JFFS2文件系统的挂载和应用程序的自启动,具体内容如下:

#!/bin/sh

echo "Start to mount!"

mount -t JFFS2 /dev/mtdblock3 /a_saveable_dir

usleep 100000

echo "Try to run shell script myconfig.sh!"

if [ -f /a_saveable_dir/config/myconfig.sh ]

then

/a_saveable_dir/config/myconfig.sh

exit 0

fi

echo "Have no shell script myconfig.sh!"

exit 0

上面第三行语句实现JFFS2文件系统的挂载,通过mount命令将MTD block3设备挂载到/a_saveable_dir目录下;第六行语句实现一个LED指示灯控制程序的自启动,这个过程首先通过执行insmod testled.ko语句加载LED驱动模块,加载后创建设备mknod /dev/gpio_drv c 231 0,其中/dev/gpio_drv为设备名称,字母c表示为字符设备,数字231和0表示主从设备号,最后执行后台进程,运行可执行文件./gpio_app &。需要注意一点,在实现挂载JFFS2文件系统之前,先需要在根目录下建立挂载点a_saveable_dir目录,目录存在后才可进行APP程序脚本配置。配置完系统启动脚本后,用LTIB工具重新进行编译即可制作完成最终的文件系统映像。最后,将制作好的引导系统、内核和文件系统映像烧写到目标板ROM。

3 文件系统的验证

图3所示为文件系统启动后终端控制台输出的部分信息,可以看到config.sh脚本已被调用。通过查看文件系统结构,发现/a_saveable_dir目录也已建立,这个目录就是JFFS2文件系统区,此目录可进行用户应用程序和数据的存取。同时,通过查看进程PS命令,可以清楚看到LED自启动控制程序也已经执行。接下来,通过mount命令检查目前已挂载的文件系统状况,可以发现类型为EXT2和JFFS2的文件出现在列表中,从而验证了本文设计的CRAMFS+JFFS2方案达到预期要求。

图3 系统启动后配置信息查看

结 语

[1] 鸟哥.鸟哥的Linux私房菜—基础学习编[M].2版.许伟,林彩娥,改编.北京:人民邮电出版社,2007.

[2] 张勇,裘雪红.嵌入式Linux下JFFS2文件系统的实现[J].计算机技术与发展,2006,16(4):138-140.

CRAMFS+JFFS2 File System Based on MPC8349E Platform

Chen Xuanyu,Zhao Binfeng,Deng Yidong,Cheng Ming,Qin Bo

(The 34th Research Institute of CETC,Guilin 541004,China)

In the paper,the necessity of introducing CRAMFS+JFFS2 in MPC8349E platform is described,then the two embedded filesystem development tools LTIB and BusyBox are introduced.Through the cooperation of two tools,a design scheme of embedded Linux file system CRAMFS+JFFS2 is proposed.The LED control procedure of self starting is achieved based on this scheme.Finally,the running status of the embedded file system is proved.

MPC8349E;CRAMFS+JFFS2;embedded file system;control procedures

TP31

A

猜你喜欢

源码脚本内核
酒驾
多内核操作系统综述①
面向数据可靠传输的高译码率带反馈的LT码
强化『高新』内核 打造农业『硅谷』
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
活化非遗文化 承启设计内核
浅谈开源操作系统的历史
安奇奇与小cool 龙(第二回)
企业如何保护源码
Linux内核mmap保护机制研究