这段时间忙于研究工具链的升级、搭建QEMU编译和测试环境以及给
Samba瘦身等等,没有及时更新博客,会在后续博文中给大家一一分享。
有朋友可能会问:为什么要自己费劲编译各种软件包,
Optware不是提供大量交叉编译好的
软件包吗?这得从海信MP800H播放机的局限性说起。
这款播放机是较早的产品,采用的是NOR闪存来存储固件,成本高因此配备的容量较低,只有16M。而较新的播放机多采用NAND闪存,比NOR成本低,容量可以做得更大(比如MP801H配备了256M的NAND闪存)。16M的空间里系统引导程序(Bootloader)和急救程序占了1280K,/usr/local/etc文件系统占了384K,在剩下的14.4M空间里要挤进Linux内核(约4M)、音频驱动(约1.8M)、视频驱动(约2.1M)以及根文件系统(约44M),看起来似乎是不可完成的任务。其实上面四大件经过压缩以后总共只有12M,所以我们还有2.4M的闪存空间可用,按照4:1的压缩比估算还可以挤进9.6M的内容。
因此在对MP800H进行扩展时,软件包的大小成为一个极其重要的考虑因素。Optware的软件包都是连接的/opt/lib下的动态库,其中包括uclibc。如果在固件中使用optware,则需要安装两套uclibc,这不仅浪费了宝贵的flash存储,也浪费了内存,因为内存中要加载两套uclibc。自己编译软件包可以确保只使用一套动态连接库,并且可以对软件包的大小进行优化。
前面在
《固件解析》中已经提到,我们可以通过修改固件安装包里package1目录下有三个文件来制作自己的固件。这三个文件就是
- Linux内核:vmlinux.develop.avhdd.mars.bin.lzma
- 根文件系统:squashfs1.img
- /usr/local/etc文件系统:usr.local.etc.tar.bz2
关于内核的定制请参考
《编译内核》。根文件系统的制作要用到
squashfs工具中的mksquashfs命令。需要注意的是播放机内核中的squashfs的版本是3.1,因此一定要使用3.x版的工具(3.0和3.4都可以)来制作squashfs1.img,如果用4.0版的mksquashfs,内核将无法挂载根文件系统。至于/usr/local/etc文件系统,它是播放机上唯一可写的闪存分区,用于存放一些允许修改的配置文件。我们可以根据需要对/usr/local/etc进行定制,不过它的容量只有384K。
自己刷固件极有可能把播放机变砖,刷机前请一定准备好串口线。
关于如何通过串口线救活砖机,请看蓝媒论坛dragon版主的大作《MP800H串口刷机指南》。