读书笔记《Building embedded linux system》Chapter 5 内核思考

 

通用的linux提供一个已经编译好的kernel,但是在嵌入式操作系统中,这种方式比较少用。我们将提供一个尽可能简单的kernel configuration,去除我们不需要的功能。我们首先需要选择linux的kernel。

我们可以在http://www.kernel.org/中得到官方(official,也成为upstream或者 mainline)的linux内核版本,他是Torvalds以及全球的其他自愿者提供。虽然2.4的版本仍在很多设备上使用,如果是新的开发应基于 2.6的版本。这些版本通常更关心工作在x86的desktop和server,但是也不会忽略嵌入式设备。嵌入式操作系统和CPU的结构有关,例如 ARM结果,ARM的开发者根据官方的版本,增加他们特定的patch,这些补丁将反馈给Linus,进入官方的版本中。我们选择linux kernel可能是网站社区,有人或者一群人来维护你所选择的架构,例如ARM、PowerPC。如果我们对kernel code有改动,应尽快地反馈,使得你的程序可以在下一版本中沿用,这同时也受到了GPL的要求。

我们也可以从第三方厂家那里得到kernel,虽然是基于上游版本,但是包括了很多的patch提供特别的功能,修订bug,已经有不少修改,它上游的版本可能有很多的不同。这种有点类似我们使用moblin封装的kernel。

当我们选择kernel后,我们对kernel进行configuration,选择所需的部分。对于嵌入式架构,包括下面的选择:Code maturity level options, General setup, Loadable module support, Block layer, Networking, Device drivers, Filesystems, Kernel hacking, Security options, Cryptographic options, Library routines。第一步是选择正确的CPU架构。我们进行配置,可以使用make config, make oldconfig, make menuconfig和make xconfig,都可以在source code那里生成一个.config文件。一般使用menuconfig,对于xconfig某些架构,例如PPC,菜单会有些问题。在上一章讲过使用 cross plateform toolchain的情况,命令如下:$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig。

在makefile中有一个参数为EXTRAVERSION,例如设置为-rmk1,则kernel为2.6.29-rmk1,可以用来提供不同版本的区别,例如增加某些模块等等。

接着就是编译,包括kernel image和kernel modules。编译kernel的例子为make ARCH=arm CROSS_COMPILE=arm-linux- zImage ,zImage表示使用gzip的压缩方式,对于x86,还可以是bzImage(表示big zImage,和bz2的压缩没有关系),这一步骤的顺利进行用于检验我们对kernel配置是否正确,也可以检验cross-development工具链环境是否正确。编译好之后,可以编译内核模块,例如:make ARCH=arm CROSS_COMPILE=arm-linux- modules。如果我们希望删除之前处理的内容,包括配置文件,编译的.o文件和kernel img,可以使用 make ARCH=arm CROSS_COMPILE=arm-linux- distclean 命令。在使用这个命令之前,请保存好配置文件img等内容。

编译之后是安装。这个将在第6章和第9张介绍。对于管理多个kernel img,每个包括vmlinux,System.map,.config以及arch/your_arch/boot/下的zImage或者 bzImage。有些架构,例如PPC,有很多boot目录,所以img不一定为arch/your_arch/boot/zImage,可以是arch /ppc/images/vmlinux.gz。建议我们将他们都存放在$(PRJROOT)/images/的路径下。内核模块的安装,包含在 makefile中,缺省的将安装在/lib/modules目录。但是我们使用的是cross的环境,不是要更新本机的内核模块,这点必须要注意。例子:$ make ARCH=arm CROSS_COMPILE=arm-linux- INSTALL_MOD_PATH=${PRJROOT}/images/modules-2.6.20 modules_install 。之后,我们将建立在模块运行中模块所需要的依赖,使用depmod,但是这个命令不使用与cross的环境,我们将从busybox网站中下载 depmod.pl来完成。一些操作的验证,将在我们下一步的实验中进行。

内核错误的一个常见情况的是kernel panic。当系统获取一个严重错误的时候(例如root文件系统位置缺失),他将停止所有的进程,并生成一个kernelpanic消息。对panic 的恢复是系统重启,可以在kernel的boot参数中设定panic=1(1秒后重启)。但是对于实际的运行环境,有时重启是不足够的,需要提醒操作者紧急情况的出现,换句话说我们需要重新定义panic出现后的处理方式。这个在kernel/panic.c中定义,可以另外改写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值