构造嵌入式Linux(一):Kernel编译

时间:2021-10-28 16:29:21

使用交叉编译环境

建立好自己的交叉编译环境,就可以进行kernel的编译。这部分也是对O'Reilly的《Building Embeded Linux System》的第五章的一个实践。我们仍使用moblin作为例子。他已经为kernel提供了config文件的例子。对于menlow,需要将config-generic和config-menlow进行合并。可以在generic的基础上,通过手工根据menlow的配置来改动,也可以使用moblin提供的merge.pl,merg.pl config-generic config-menlow > wei-config,然后cp wei-config .config,即可。在alpha3的版本似乎merge的结果有些问题,还是需要进行手动来改,但是在beta的版本中,没有问题。

$ make ARCH=x86 CROSS_COMPILE=i586-linux- bzImage  『由于kernel比较大,如果使用zImage,会报错,要求使用bzImage』
$ make ARCH=x86 CROSS_COMPILE=i586-linux- modules 

对于交叉编译环境,为了不会出现误操作,覆盖我们host系统文件,不要使用root的身份进行。在完成编译之后,我们整理生成的关键系统文件,并将其保存好:

$ cp System.map $PRJROOT/images/myproject/System.map-2.6.29-menlow
$ cp vmlinux $PRJROOT/images/myproject/vmlinux-2.6.29-menlow
$ cp .config $PRJROOT/images/myproject/2.6.29-menlow.config
$ cp arch/x86/boot/bzImage $PRJROOT/images/myproject/bzImage2.6.29-menlow
$ mkdir modules-2.6.29-menlow
//用于存放我们modules

安装模块,存放在指定的位置:$ make ARCH=x86 CROSS_COMPILE=i586-linux- INSTALL_MOD_PATH=$PRJROOT/images/myproject/modules-2.6.29-menlow modules_install

我们需要通过busybox来建立模块之间的依赖关系。

$ wget http://busybox.net/downloads/busybox-1.13.4.tar.bz2
$ cd busybox-1.1.1
$ make defconfig
  //使用默认配置,可以通过 make menuconfig来进行配置,好多选项
$ make

BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用。BusyBox 揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如grep和find)都需要在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。实际上, BusyBox 可以将大约 3.5MB 的工具包装成大约 200KB 大小。这就为可引导的磁盘和使用 Linux 的嵌入式设备提供了更多功能。我们可以对 2.4 和 2.6 版本的 Linux 内核使用 BusyBox。

在exampls/depmod.pl放置在工具位置中。

$ depmod.pl –k ./vmlinux-2.6.29-menlow [或者使用-F System.map-2.6.29-menlow] –b $PRJROOT/images/myproject/modules-2.6.29-menlow/lib/modules/2.6.29.1-menlow  $PRJROOT/images/myproject/modules-2.6.29-menlow/lib/modules/2.6.29.1-menlow/modules.dep

重新生成modules.dep,我也将其copy到$PRJROOT/images/myproject/modules.dep-2.6.29-menlow。

使用MIC2的开发环境

在MIC2中有moblin-chroot工具,可以生成我们的开发环境,并提供模拟的target。我们在生成image的kickstart文件中直接将kernel-netbook改为kernel-menlow ,发安装的时候出现花屏现象,如果我们将netbook的img在MID上安装,可以装上,但是速度很慢,可能和CPU的适配有关系,不可以容忍。在加上各类的driver之前,我们需要在netbook版本的基础上,将kernel适配menlow芯片。

  • [wei@wei project]$ sudo moblin-chroot -s wei-kernel-chroot --unpack-only moblin-netbook-core-developer-alpha3-200905081154.usbimg //进入模拟环境
  • [wei@wei project]$ sudo moblin-chroot wei-kernel-chroot/
  • bash-3.2# alias ls="ls --color" //不习惯没有颜色的情况,修正一下
  • bash-3.2# rpm -ivh kernel-2.6.29.1-18.1.moblin2.src.rpm //解开rpm的包
  • bash-3.2# cd ~
    bash-3.2# echo %_default_patch_fuzz 2 > .rpmmacros
    在 alpha3中alpha3版本中带补丁,使用fuzz 0,出现错误:
    Patch #8 (linux-2.6.29-drm-revert.patch):
    + /bin/cat /home/wei/rpmbuild/SOURCES/linux-2.6.29-drm-revert.patch
    + /usr/bin/patch -s -p1 --fuzz=0
    -- saving rejects to file drivers/gpu/drm/i915/i915_dma.c.rej
    1 out of 1 hunk FAILED -- saving rejects to file drivers/gpu/drm/i915/i915_drv.h.rej
    error: Bad exit status from /var/tmp/rpm-tmp.JUmRvI (%prep)需要至为fuzz 2,但是在beta版本中,没有这个问题,无需此步骤 。fuzz:如果找不到这些位置,且如果 patch 命令正在应用上下文差异列表,patch 命令能进行非精确搜索。fuzz factor 指定了非精确匹配的行数目。如果模糊因子设置成 1 或者更大,patch 命令执行第二次扫描,这一次忽略上下文的第一行和最后一行。如果没有匹配结果,且最大模糊因子设置成 2 或者更大, patch 命令执行第三次扫描,这一次会忽略上下文的前两行和最后两行。(缺省模糊因子最大值为 2)。如果找不到匹配的位置,patch 命令在拒绝文件中放置块(hunk)。创建拒绝文件时,其名称和输出文件一样,只是在文件名有后缀 .rej。使用 -r 标志可以覆盖此命名约定。
  • bash-3.2# cd rpmbuild/
    bash-3.2# ls
    SOURCES  SPECS
    bash-3.2# cd SPECS/
    bash-3.2# rpmbuild -bp kernel.spec
    //打补丁
  • 生成.config的方式同交叉编译环境
  • bash-3.2# make ARCH=x86 bzImage
  • bash-3.2# make ARCH=x86 modules
  • bash-3.2# make ARCH=x86 modules_install
  • 可以通过yum来导入busybox,但是我找遍到depmod.pl,有提供depmod,但是运行的时候有报错,我还是下载了busybox的包,运行#~/bin/depmod.pl -k ./vmlinux-2.6.29-menlow -b /lib/modules/2.6.29.3-menlow/  /lib/modules/2.6.29.3-menlow/modules.dep

我试过直接使用make install来安装,make install似乎将bzImage的文件copy到/boot下面作为vmlinuz。但是想通过MIC2将其制作为img的时候,出现以下报错:

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
tune2fs 1.41.3 (12-Oct-2008)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds
Copying filesystem...
Error creating Live CD : Unable to copy valid kernels or initrds, please check the repo
Your new image can be found here:
Finished.

这个问题,需要进一步解决。在moblin中没有/etc/grub.conf文件,而/boot/grub和普通的linux长得不一样。原因是在/boot里面没有发现initrd-文件。这个文件似乎在make modules_install的步骤中被删除。

修改时区:

1,在/usr/share/zoneinfo/目录下查询想要更换的时区名称
2,将原有的localtime文件移走;
       # mv /etc/localtime  /etc/localtime-old
3,做新的localtime文件,将对应的时区文件链接过来
       # ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime