Linux内核负责管理/调度所有的系统资源和设备,并为应用程序提供服务。要想让播放机支持更多的设备,比如USB无线网卡,必需从内核入手。Linux支持动态加载模块,这些模块其实也是内核的一部分,只不过是被模块化罢了。模块化的好处之一是可以在需要时才加载模块,不需要时可以卸载,释放其占用的内存。这对内存紧张的嵌入式系统无疑是有帮助的。
我重新编译内核有以下几个目的:
1) 打开官方内核中某些没有打开的功能,如NFS服务器。
2) 尝试支持更多外部设备,如编译第三方驱动程序。
3) 内核瘦身,比如关闭某些不需要的功能,或者将其编译成模块。
内核源码仍使用
华硕公布的源码,其中名为
linux-2.6.12.274877.tgz的文件即是内核源码。用
tar zxf linux-2.6.12.274877.tgz解开此文件,得到linux-2.6.12目录。看一下版本号
1 $ grep UTS_RELEASE linux-2.6.12/include/linux/version.h
2 #define UTS_RELEASE "2.6.12.6-VENUS"
与在播放机上用'uname -r'看到的一样,因此我们能确信这就是播放机所用内核的源码,虽然来源不是海信,但是我认为海信不会在内核上做什么改动,最多不过调整一些配置参数。
粗略研究了一下内核源码,发现Realtek在原始的2.6.12.6内核基础上做了不少修改,下面列出其中一部分:
- 文件系统方面增加了
- fuse - Filesystem in Userspace
- ptp - Picture Transfer Protocol,用于数码相机
- vcd - CDROM文件系统
- squashfs - 压缩的只读文件系统
- yaffs - 针对NAND闪存优化的文件系统
- 大量的MIPS平台更新,其中包括对Realtek Venus系统(就是播放机所用系统)的支持
- 增加了Realtek无线网卡支持,包括RTL8185,RTL8187,RTL8190,RTL8192,RTL8191SU等芯片组的支持。
- 增加了一些专门针对Realtek Venus的优化
linux-2.6.12目录下有两个配置文件样本:config.develop.avhdd.mars.old 和 config.rescue.usb.flash.mars.old。根据字面意思推测第一个文件是常规模式的内核配置,第二个是急救模式的内核配置。急救模式只保留了急救固件升级所需功能,因此编译出的内核比常规模式的小很多。在MP800H上,急救内核与Bootloader放在同一个flash分区内,正常的固件升级不会更新这一部分。关于通过串口激活急救模式进行固件升级的方法,请看蓝媒论坛dragon版主的大作《MP800H串口刷机指南》。
我以config.develop.avhdd.mars.old为基准对内核进行配置(执行make menuconfig),打开了NFS Server Support(编译成模块,并且只打开NFSv3支持),其余部分保持不变,最后得到的.config文件增加了如下几项:
1 CONFIG_NFSD=m
2 CONFIG_NFSD_V3=y
3 CONFIG_NFSD_TCP=y
4 CONFIG_EXPORTFS=m
然后执行make进行编译(注意:编译内核要用/usr/bin下的工具链,即mipsel-sdelinux-v6.03.01-1,在PATH中/usr/bin应该在/usr/local/bin的前面)。编译完成后会生成名为vmlinux.bin的文件,用lzma把它压缩后改名为vmlinux.develop.avhdd.mars.bin.lzma,这个文件即可用于制作固件。另外还需要把编译好的模块安装到某个目录以便于打包,比如要安装到/home/user/dist/modules则执行如下命令:
1 make INSTALL_MOD_PATH=/home/user/dist/modules modules_install
至此,我们已经准备好了新的内核和模块。在用自己编译的模块替换官方固件模块时要注意两点:
1. 如果配置内核是打开了DEBUG,编译出的模块会很大,在制作固件前最好把调试信息去掉。下面的命令可以很容易的完成这个任务:
1 $ cd /home/user/dist/modules
2 $ find . -name '*.ko' -exec mipsel-linux-strip --strip-unneeded '{}' \;
2. 有一个模块ufsd.ko是没有源码的,这个模块提供NTFS读写的支持。如果你想使用NTFS,则要从官方固件中拷贝这个文件。