XIP可以分为以下2种:
① 内核XIP。直接在Flash/ROM中运行内核,可以节省复制和映像解压的时间。Linux 2.6.10内核已经包含了XIP支持。
② 应用程序XIP。直接从应用程序代码的存储位置执行,而不用将它加载到RAM中,这样应用程序的第一次执行速度会比较快。要使用应用程序XIP,应该基于支持它的文件系统。
3.2 XIP文件系统
目前XIP文件系统的实现主要有2种: Linear XIP CRAMFS和Advanced XIP File System(AXFS)。
CRAMFS是一个压缩的只读文件系统,本来用于桌面Linux系统的启动,但CRAMFS经过修改后可以支持嵌入式系统并支持XIP。Linear XIP CRAMFS用一个sticky bit对它管理的文件进行区分,标记为压缩(按需分页)或者未压缩(XIP)。如果文件标记为XIP,则所有页都不压缩,而且要在Flash中连续存储。在加载XIP文件时,直接对所有页地址进行映射;而按需分页的文件则在发生页错误时,将相应页解压到RAM中。
要创建Linear XIP CRAMFS文件系统映像,必须确定可执行文件和库文件的使用频率,频繁使用的文件适合于XIP,而其他文件应该进行压缩。现在有一些工具(如RAMUST和CFSST)可以帮助判断哪些文件需要XIP,而哪些不需要。下面就可以给XIP文件加上标记并制作根文件系统,以使用mkfs.cramfs工具为例:
chmod +t filenames
mkfs.cramfs-x rootfs rootfs.bin
另外,还要修改内核配置参数以支持XIP:在启动选项中向默认内核命令字符串中加入 rootfstype=cramfs,选择内核XIP并设置XIP内核物理地址;在驱动程序中加入MTD对XIP的支持;在文件系统中加入对Linear XIP CRAMFS的支持。接下来就可以生成XIP映像了。
Linear XIP CRAMFS的一个缺陷在于它是基于文件的,即一个文件中的所有页要么全部采用XIP,要么全部采用压缩/按需分页,但事实上同一文件中不同页的使用频率区别也很大。AXFS是Intel公司开发的一个新的只读文件系统,它从Linear XIP CRAMFS中继承了许多方法,同时也进行了一些改进。AXFS的XIP粒度是基于页的,并且自带工具来判断哪些页需要XIP,哪些页需要压缩,从而更好地在速度和RAM/Flash的使用上取得平衡。
3.3 非XIP文件系统
XIP一般基于NOR Flash,成本相对较高。对于用户数据量大的应用,往往还要使用基于NAND Flash的,非XIP的文件系统常用的有JFFS2/YAFFS。
JFFS2是一种基于压缩的文件系统。在多媒体应用中,如果图片、音视频已经经过压缩,则使用JFFS2无疑会给CPU带来双重的压缩/解压负担,访问速度也会受到影响。因此,在这类应用比较密集的应用中,采用不压缩的文件系统(如YAFFS/YAFFS2)可以加快系统速度。
YAFFS/YAFFS2是专为嵌入式系统使用NAND Flash设计的日志文件系统。与JFFS2相比,减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。YAFFS/YAFFS2自带NAND芯片的驱动,用户可以不使用MTD和VFS,直接对文件系统操作。YAFFS与YAFFS2的主要区别在于:前者仅支持小页(512字节) NAND Flash;后者则可支持大页(2 KB) NAND Flash,同时在内存使用、垃圾回收、访问速度等方面有所改进。
结语
快速启动对于嵌入式Linux系统是比较迫切的要求之一。本文通过分析嵌入式系统的引导过程和关键时延因素,提出了相应的解决办法,并对XIP文件系统进行了介绍。由于启动速度非常依赖于硬件平台,而且有的方法互相排斥,因此在具体应用时需要综合考虑和选择。