本博客倡导开放源代码,在此公布之程序源代码如无特别声明均采用GNU通用公共 许可证(GPL)

乐在其中

分享学习Linux的乐趣

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  23 随笔 :: 0 文章 :: 401 评论 :: 0 Trackbacks
海信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.tgz
2. 华硕公布的工具链 1073_toolchain.tgz
3. squashfs-lzma 内核补丁 linux-2.6.12.6-VENUS-squashfs3.4lzma.patch.bz2
4. mksquashfs_lzma 以及 unsquashfs_lzma
posted on 2011-10-17 00:10 gouzhuang 阅读(6413) 评论(0)  编辑 收藏 引用 所属分类: 嵌入式Linux
只有注册用户登录后才能发表评论。