uclinux内核配置与裁减

起始内核线程init的任务依然是初始化,只不过是一种更高层次的初始化。

函数do_basic_setup()是init进程中最重要的函数,与嵌入式系统关系最紧密的是其中的do_initcalls()函数,该函数与设备驱动程序加载有关。
函数prepare_namespace()函数主要目的是准备好系统的命名空间,其中最重要的函数是mount_root(),其功能是挂载根文件系统。
四个run_init_process()函数查找init进程程序并尝试执行。如果没有找到一个可以执行的init程序,则报告错误“Noinit found”。
C,初始化设备驱动
参考B中的do_basic_setup()函数。
D,挂接根文件系统
参考B中的prepare_namespace()函数。
E, 启动用户空间init进程
当内核挂载了根文件系统后,内核的启动工作就全部结束了,但系统还不能正常启动起来,因为还需要通过根文件系统上的init程序来完成一下最后的设置工作。这个init程序一般在/sbin、/etc或/bin目录下。
三,裁减内核(不带根文件系统)并烧写到flash中:
该步承接上步的工作。由于上步已经做了一定的裁减,该步只需要在此基础上进一步裁减即可。该步工作相对叫简单,只需要将不需要的驱动选项取消即可,当然要注意保证内核的依赖关系。
我们的flash容量为512KB,u-boot占有64KB空间,剩下的只有448KB。另外,根文件系统大约还需要100KB空间,所以内核大小要控制在350KB以内。我们先尝试将不需要的驱动和选项全部取消,让内核运行起来。
在“二,配置并在RAM中运行内核(不带根文件系统)”的基础上,我们进一步删除的驱动包括:
l 取消“Loadble module support”支持
l 取消“Block layer”支持
l 取消“Bus options”所有支持
l 取消“Power management options”支持
l 取消“CPU Frequency scaling”支持
l 取消“Profiling Support”支持
l 取消“Security options”支持
l 取消“Cryptographic options”支持
l 取消除了串口和MTD以外的所有硬件驱动支持
l 取消内部RTC驱动
l 取消对ELF格式文件支持
取消以上选项后,内核可以控制在350KB以内了。所以,不需进一步修改Makefile来裁减内核了。这样就可以下载并烧写到flash内保存了。
四,配置应用程序和裁减根文件系统:
根文件系统挂载到内核有两种基本方式:独立于内核存放通过MTD分区识别并挂载和链接到内核数据段通过ramdisk挂载(两种方式都是我自己概括的,可能描述上有些不尽合理,仅供参考)。不论那种方式,都需要MTD驱动支持,所以内核要支持MTD并配置正确,保持华恒源码包原MTD配置即可。
HHBF5XX 的Linux BSP 使用ext2 格式的ramdisk 作为根文件系统,直接链接到内核数据段,所以这里介绍这种方式。另一种方式这里不作介绍,其相关资料更丰富。
与根文件系统(ramfs)相关的链接内容如下,位于文件/linux-2.6.x/arch/Blackfin/Kernel/vmlinux.lds.S中。

内核通过__initramfs_start和__initramfs_end找到根文件系统的img,这两个变量在文件/linux-2.6.x/init/Initramfs.c中被引用。
介绍完根文件系统的挂载方式,我们来介绍如何配置和裁减应用程序。
由于flash容量限制,而且我们也并不需要很多应用程序的支持,所以我们可以只保留最简单的init、sh、ls、cd等应用程序,其他应用全部裁减掉。注意必须保证要有init和sh,否则内核无法运行或没有shell界面。另外,为了进一步裁减体积,我们利用busybox制作根文件系统,busybox的介绍文档网上非常多,这里不再介绍。
按照以上分析,我们来配置应用程序和busybox。
按照“一,配置并在RAM中运行内核(不带根文件系统)”中介绍的方法进入应用程序配置页。只需选中Busybox内的BusyboxSVN,其余选项全部取消,完全用busybox代替。
然后,我们来配置busybox。进入busybox目录,运行配置命令:
#cd user/busybox-svn
#make menuconfig
除了按照我们上面介绍的,保留最基本的应用程序之外,其他全部取消;还有一点需要特别注意。就是在“Build options”选择中选中编译成静态库,而不要编译成共享库,这样在根文件系统挂载时省去很多麻烦,虽然最后得到的内核体积会稍微增大一下。共享库的应用可以在内核运行成功后,进一步学习。
这样配置得到的根文件系统已经裁减了很大体积,但下载到SDRAM中运行时会发现根文件系统占有的内存空间仍然很大,始终保持12.5MB空间。这是因为,根文件系统的运行空间是在生成镜像时指定的。要裁减占有的内存空间,可以如下修改。
#vi vender/HHTech/BF533-HHBF/Makefile
修改第14行的“BLOCKS = 12800”为较小的值,比如说4096等,必须是256的整数倍,否则内核运行时根文件系统报错。这样修改后,根文件系统占有的flash和SDRAM空间都会相应减小。
通过以上裁减后,带有根文件系统的内核镜像完全可以控制在448KB以内,下载保存到flash后运行,你就可以看到可爱的“uClinux”欢迎界面了。
评论