海信MP800H配置的闪存只有16M,其中Bootloader就占了1.25M(1280K),剩下的14.75M用于存放固件。而固件又分为五块,正如configuration.xml文件中描述的:
<flash>
<image type="linuxKernel">
<fileName>package1/vmlinux.develop.avhdd.mars.bin.lzma</fileName>
<targetAddress>0x80100000</targetAddress>
<version>SVN:</version>
</image>
<image type="audioKernel">
<fileName>package1/bluecore.audio.lzma</fileName>
<targetAddress>0x81b00000</targetAddress>
<version>N/A</version>
</image>
<image type="videoKernel">
<fileName>package1/bluecore.video.lzma</fileName>
<targetAddress>0x81d80000</targetAddress>
<version>N/A</version>
</image>
<image type="squash">
<fileName>package1/squashfs1.img</fileName>
<mountPoint>/</mountPoint>
</image>
<image type="jffs2">
<fileName>package1/usr.local.etc.tar.bz2</fileName>
<sizeBytesMin>0x50000</sizeBytesMin>
<mountPoint>/usr/local/etc</mountPoint>
</image>
</flash>
其中LinuxKernel,audioKernel,videoKernel三块加起来大约2.3MB,而且这几块的大小比较固定,没有什么文章可做。/usr/local/etc分区最小要384K。所以squashfs1.img的最大理论尺寸大约是:12.1M(16M - 1.25M - 2.3M - 384K)。如何更充分地利用这12.1M的空间呢?本文试图提供一种解决方案。
Squashfs是一种压缩的只读文件系统。播放机内核包含的是squashfs-3.1,该版本只支持
LZO压缩算法。LZO的特点是压缩/解压速度很快,但压缩比不是太高。有另外一种叫做
LZMA压缩算法,压缩比非常高。
squashfs-lzma.org网站提供了一个针对squashfs-3.4的补丁
sqlzma3.4-457.tar.bz2,可以使其支持LZMA算法。我花了些时间把支持LZMA的squashfs-3.4移植到播放机的内核linux-2.6.12.6-VENSU(内核补丁:
linux-2.6.12.6-VENUS-squashfs3.4lzma.patch.bz2)。
与驱动程序配套的还有两个工具程序:mksquashfs和unsquashfs。为了和3.1版的工具区别开来,我分别把它们命名为mksquashfs_lzma和unsquashfs_lzma,编译好的Linux可执行文件可以在
这里下载。mksquashfs_lzma 有一个叫block_size的参数,block_size越大通常压缩比也越大,同时解压所需内存也越多。考虑到播放机的内存有限,通常我选取的block_size为64K和128K。
为了比较一下两种算法的压缩比,我用官方固件来做一个测试。V049官方固件的squashfs1.img大小为9.79M,解压后用mksquashfs_lzma分别以64K和128K的block_size重新压缩,得到的文件大小为8.41M(block_size=64K)和8.12M(block_size=128K),比LZO压缩分别小了1.38M(14%)和1.67M(17%)。
其实移植工作早在一年以前就完成了,但当时发现它的性能不理想:DvdPlayer启动比较慢,并且影片预览延迟较大。当时以为是解压算法对CPU性能要求较高,可能是播放机的CPU太慢了。最近一个偶然的机会我在重新编译内核时调整了两个参数:
1. SQUASHFS_NO_PREEMPT = No (原来是Yes)
2. SQUASHFS_FRAGMENT_CACHE_SIZE = 8 (原来是3)
我发现新编译的内核性能有了明显的改善:DvdPlayer启动甚至感觉比官方内核还快,预览也已经感觉不到有差别了。这说明我们可以在提高压缩比的同时并不牺牲性能,这确实令人感到兴奋。(注:用于测试的squashfs采用的block_size为64K)
相关下载:
1. 华硕公布的内核源代码
linux-2.6.12.274877.tgz2. 华硕公布的工具链
1073_toolchain.tgz3. squashfs-lzma 内核补丁
linux-2.6.12.6-VENUS-squashfs3.4lzma.patch.bz24.
mksquashfs_lzma 以及
unsquashfs_lzma