PC机系统:Ubuntu 12.04 LTS
目标板:海思3518C
Flash类型:SPI Flash(16M)
Busybox:BusyBox-1.16.1.tgz
嵌入式交叉编译工具链:arm-hisiv100nptl-linux-gcc
目标板根文件系统格式:JFFS2(在闪存上使用非常广泛的读/写文件系统)
根文件系统制作工具:mkfs.jffs2
一、mkfs.jffs2工具使用说明:
mkfs.jffs2: Usage: mkfs.jffs2 [OPTIONS]
示例:
mkfs.jffs2 -r rootfs -o rootfs_64k.jffs2 -e 0x20000 --pad=0x1000000 -s 0x800 -n
Options:
-p,--pad[=SIZE] 用16进制来表示所要输出档案的大小,也就是root.jffs2的size。 很重要的是,为了不浪费flash空間, 这个值最好符合flash driver所规划的区域大小。 如果不足则使用0xff来填充补满。
-r, -d, --root=DIR 指定要做成image的源資料夾.(默认:当前文件夹)
-s, --pagesize=SIZE 节点页大小(默认: 4KiB)
-e, --eraseblock=SIZE 设定擦除块的大小为(默认: 64KiB)
-c, --cleanmarker=SIZE Size of cleanmarker (default 12)
-m, --compr-mode=MODE 选择压缩模式 (default: priortiry)
-x, --disable-compressor=COMPRESSOR_NAME 禁用压缩
-X, --enable-compressor=COMPRESSOR_NAME 启用指定的压缩工具
-y, --compressor-priority=PRIORITY:COMPRESSOR_NAME
设置所指定的压缩工具的优先级
-L, --list-compressors 列出所有可用的压缩工具
-t, --test-compression Call decompress and compare with the original (for test)
-n, --no-cleanmarkers 指明不添加清除标记(nand flash 有自己的校检块,存放相关的信息。)
注:如果挂载后会出现类似:CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0 的警告,则加上-n 就会消失。
-o, --output=FILE 指定输出image档案的文件名(default: stdout)
-l, --little-endian 指定使用小端格式
-b, --big-endian 指定使用大端格式
-D, --devtable=FILE 使用指定的文件作为一种设备tablefile-f, --faketime Change all file times to '0' for regression testing
-q, --squash Squash permissions and owners making all files be owned by root
-U, --squash-uids 将所有文件的拥有者设为root用户
-P, --squash-perms Squash permissions on all files
--with-xattr stuff all xattr entries into image
--with-selinux stuff only SELinux Labels into jffs2 image
--with-posix-acl stuff only POSIX ACL entries into jffs2 image
-h, --help 显示这些文字
-v, --verbose Verbose operation
-V, --version 显示版本
-i, --incremental=FILE Parse FILE and generate appendage output for it
二、利用BusyBox-1.16.1版本来制作根文件系统:
1、获取BusyBox源码:
从海思提供的SDK包中得到BusyBox源码包。
tar -xvf busybox-1.16.1.tgz
cd busybox-1.16.1
2、配置和编译BusyBox:
make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- menuconfig
//以图形界面进行选择配置
注意:
在 Busybox Settings ---> Build Options 中注意下面两个选项:
[*]Build BusyBox as a static binary (no shared libs)
(arm-hisiv100nptl-linux-) Cross Compiler prefix
其中:
前者选项用于是否把 busybox 编译成静态链接的可执行文件。如果选择该选项,编译出来的 busybox 就是静态链接的,运行时不依赖于动态库,但体积较大;清除该选项将得到动态链接的 busybox,体积较小,但需要动态库的支持。
后者选项是用于选择 SDK 推荐的交叉编译器。
配置好后保存并退出。
这个步骤中,可以对busybox进行裁剪,根据实际需要裁剪掉某些命令或者库,可以减小镜像文件的大小。
3、 编译和安装 busybox:
make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- //编译。
make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- install //安装。
编译并安装成功后,在 busybox 目录下的_install 目录下生成以下目录及文件:
drwxr-xr-x 2 root root 4096 4月 16 15:21 bin/
lrwxrwxrwx 1 root root 11 4月 16 15:21 linuxrc -> bin/busybox*
drwxr-xr-x 2 root root 4096 4月 16 15:21 sbin/
drwxr-xr-x 4 root root 4096 4月 15 23:56 usr/
4、制作根文件系统:
我制作根文件系统的具体操作步骤如下:
4.1、创建rootfs目录:
mkdir rootfs
cd rootfs/
4.2、从BusyBox中获取相应文件夹到rootfs中:
cp -rfa ../busybox/busybox-1.16.1/_install/* .
4.3、创建文件系统中常用的目录:
mkdir etc dev lib tmp var mnt home proc tmpfs
4.4、获取系统依赖库:
注意此步骤获取的是SDK开发包中对应的交叉编译工具链目录下的lib目录下的so库。如果用错了系统依赖的库,会导致只有BusyBox编译出来的命令可以正常运行,而你自己的用户态程序运行时报错:Input/Output error。
4.5、获取其它工具:
一般SDK中会包含有除busybox以外的公用应用工具如udev、用户层调用的驱动接口工具等,如海思的himount、btools等。这些工具可以在SDK包中找到相应对应源码,根据说明文档进行交叉编译之后得到可执行的bin文件,拷贝到rootfs/bin/目录下即可。
4.6、添加系统运行所需要的模块驱动:
从SDK开发包中找到应用示例目录,如samples,其中包含有系统各个常用模块的驱动,把这些文件拷贝到rootfs/lib/modules/目录下即可。
4.7、获取用户程序运行所依赖的库:
从SDK开发包中找到应用示例目录,如samples,其中包含有用户态程序运行时所依赖的动态库文件,把这些文件拷贝到rootfs/usr/lib/目录下即可。
4.8、生成根文件系统镜像:
cd ../
mkfs.jffs2 -d ./rootfs -l -e 0x10000 -o rootfs_64k.jffs2
到此,就生成了一个初级的rootfs.jffs2根文件系统镜像文件了。
补充说明:
嵌入式常用文件系统如:SquashFS、JFFS2、NFS、YAFFS2。
各自特点:
SquahFS和JFFS2具有良好的空间特性,很适合作嵌入式文件系统。
SquahFS为只读文件系统。
JFFS2为可读可写的文件系统。
NFS文件系统适合于开发初期的调试阶段。
YAFFS2文件系统只适用于NAND Flash。
4.9、烧录根文件系统rootfs.jffs2到SPI Flash中:
sf probe 0 //对 SPI Flash 进行初始化设置
sf erase 0x400000 0xc00000 //首先擦除 FLASH 的文件系统分区,从0x400000地址开始,擦除大小为0xc00000(12M)。
mw.b 0x82000000 0xff 0xc00000
tftp 0x82000000 rootfs_64k.jffs2 //将 rootfs_64k.jffs2 文件下载到内存0x82000000处。
sf write 0x82000000 0x400000 0xc00000 //把文件系统从内存写入SPI FLASH中0x400000地址起始处,大小为0xc00000(12M)。
reset //重启
如果各步骤制作的镜像没有问题,至此重启后,设备即会进入到自己制作的文件系统中。
以上生成的根文件系统是一个裸的文件系统,没有做相应功能的部署。
如果要对文件系统部署,可以根据实际需求来灵活修改/etc/init.d/rcS和/etc/init.d/目录下的脚本文件,在此暂不作讨论。