正文

AT91samRLek 评估板内核编译2010-03-30 15:39:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/miaowei/50849.html

分享到:

本 文主要介绍如何构建在x86平台上交叉编译各平台上的嵌入式Linux内核。要完成这个过程,首先必须确认有相应的交叉编译工具链。工具链可以自己编译获 得,但是对于初学者我们不推荐这么作,网上大有许多编译好的优秀的工具链。本文将以编译Atmel的AT91sam9RL_EK评估板的内核为例子,其他平台基本步骤差异不大。为了显示最 新性,也采用可2.6.26版本的内核。

首先必须获得最新版本的内核,可以在ftp.kernel.org上下载我们需要的2.6.26的内核。获得相应内核包后,解压:

对于 Linux-2.6.26.tar.gz为
tar zxvf Linux-2.6.26.tar.gz

对于 Linux-2.6.26.tar.bz2为
tar xjvf Linux-2.6.26.tar.bz2

之后进入Linux-2.6.26文件夹内。
如果机器上已有2.6.26内核代码,也可以直接使用,但要清除上次编译的遗留物,可以
make distclean

或者

make mrproper

准 备结束后,我们开始配置内核。在本机编译内核时,我们可以直接make menuconfig之类,就合根据我们机器当前内核的配置生产.config文件。但对于嵌入式当然就很困难。幸亏Linux支持上百种平台。对于不同 平台都有默认的配置文件,对于我们使用的arm,可以在/arch/arm/configs文件夹下看到
我们要根据自己所使用的平台来选择。例如我们这里使用的Ateml的AT91sam9RL_EK评估板,可以选择at91sam9rlek_defconfig。之后只要运行
make ARCH=arm CROSS_COMPILE=arm-Linux- at91sam9rlek_defconfig

成功后会显示:

#

# Configuration written to .config

#

其中,.config 是生成的配置文件,在主Makefile中可以看到有这么一行。

KCONFIG_CONFIG ?= .config

同时会在 include/linux下生成一个autoconf.h的文件,这个文件在Makefile的后面会用到。

对于我们使用的两个宏ARCH和CROSS_COMPILE,分别是指我们选择的体系结构(Linux在内核代码树arch文件夹中列出支持的体系结构)和交叉编译器的前缀。

如果我们想要对这个默认的configuration进行一些修改,可以运行
make menucnfig
进行修改。修改完毕后,在重新save就可以了。注意在save的时候,名字还是.config,点击OK就可以。

之后就是编译了,对于嵌入式大多是编译成镜像文件,这里编译成zImage
make ARCH=arm CROSS_COMPILE=arm-Linux- zImage

如果有选择模块,还要
make ARCH=arm CROSS_COMPILE=arm-Linux- modules


make ARCH=arm CROSS_COMPILE=arm-Linux- INSTALL_MOD_PATH= modules_install

宏INSTALL_MOD_PATH是选择模块安装的根目录,这里我们选择的是我们为嵌入式准备的寄生文件系统路径,默认是本机的根目录(即/),如果设置这个宏会把模块安装大/lib/modules文件夹中,有时候这是灾难性的。

其实,现在的内核,很多Image, zImage和模块都只要make就能全部编译出来。所以,对于有些Makefile,只需要

make ARCH=arm CROSS_COMPILE=arm-linux-

就可以了。

这 样就搞定了,是不是缺了什么?我们差点忘记了编译好的zImage。他在什么地方?对于一般而言是在 Linux-2.6.26/arch/$ARCH/boot里,本次是在 Linux-2.6.26/arch/arm/boot 找到他了,一看居然有1.5兆这么大。怎么变小能?关键就是在make menucnfig阶段了,这阶段才是技术要求所在。

 

最后,说明一下最后生成的vmlinux, image, zImage之间的关系。

从下面的内核编译过程,可以看出 ./vmlinux, arch/arm/boot/compressed/vmlinux, arch/arm/boot/Image, arch/arm/boot/zImage 之间的区别
 
  LD      vmlinux
  SYSMAP  System.map
  SYSMAP  .tmp_System.map
  OBJCOPY arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready
  AS      arch/arm/boot/compressed/head.o
  GZIP    arch/arm/boot/compressed/piggy.gz
  AS      arch/arm/boot/compressed/piggy.o
  CC      arch/arm/boot/compressed/misc.o
  AS      arch/arm/boot/compressed/head-xscale.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage

vmlinux 是一个elf格式的文件
Image 是经过objcopy 处理了的只包含内核代码,数据的一个文件, 已经不是elf格式的了。此时还没有经过压缩
arch/arm/boot/compressed/vmlinux 是经过压缩的Image和加入了解压头的elf格式的文件
arch/arm/boot/zImage 是经过objcopy处理了的可以直接下到对应的地址执行的内核镜像

阅读(2769) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册