Chinaunix首页 | 论坛 | 博客
  • 博客访问: 64937
  • 博文数量: 10
  • 博客积分: 272
  • 博客等级: 二等列兵
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 16:47
文章分类
文章存档

2011年(10)

分类: LINUX

2011-03-01 16:26:41

    本文主要介绍适合ARM 处理器S3C2440目标板的最新版本linux 内核 linux-2.6.37.1的交叉编译。环境为:Fedora14,编译器arm-linux-4.3.2

 

1linux内核的编译过程

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

对于 Linux-2.6.37.1.tar.gz
tar  zxvf  Linux-2.6.37.1.tar.gz

对于 Linux-2.6.37.1.tar.bz2
tar  xjvf  Linux-2.6.37.1.tar.bz2

之后进入Linux-2.6.37.1文件夹内。:

cd linux-2.6.37.1

 

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

对于我们使用的两个宏ARCHCROSS_COMPILE,分别是指我们选择的体系结构(Linux在内核代码树arch文件夹中列出支持的体系结构)和交叉编译器的前缀。(当然也可以直接修改MakefileARCHCROSS_COMPILE参数)。

这里我们通过配置界面中“Load an Alternate Configuration File”加载/arch/arm/configs/s3c2410_defconfig

然后我们根据平台的特性进行相应的配置,配置完毕保存成默认配置(.config)。

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

一般而言编译好的镜像文件zImage是在 Linux-2.6.26/arch/$ARCH/boot里,本次当然是在 Linux-2.6.26/arch/arm/boot找到他了,一看居然有1.7兆这么大。怎么变小呢?关键就是在make menucnfig阶段了,这阶段才是技术要求所在。

2 、编译适应S3C2440目标板的linux内核

1)、首先linux启动过程中需要校验machine ID,因此我们修改linux内核的文件arch\arm\tools\mach-types中:

s3c2440      ARCH_S3C2440    S3C2440       1008 //1008,uboot中一致

说明:不建议直接修改arch/arm/kernel/head.S文件通过R1寄存器直接传递machine ID给内核。

修改内核文件arch/arm/plat-s3c24xx/common-smdk.c文件中Nand Flash分区。这里只创建四个分区,其他多余的分区屏蔽掉(这里的分区需要和u-boot中的分区信息一致)

static struct mtd_partition smdk_default_nand_part[] = {

   [0] = {

       .name  = "bootloader",

       .size  = 0x30000,

       .offset    = 0,

   },

   [1] = {

       .name  = "params",

       .offset = 0x30000,

       .size  = 0x10000,

   },

   [2] = {

       .name  = "kernel",

       .offset = 0x50000,

       .size  = SZ_2M,

   },

   [3] = {

       .name  = "root",

       .offset    = 0x250000,

       .size  = (0x4000000-0x2500000),

   },

};

 2)、配置内核模块的功能,有几种方式可以进行界面选择:

make menuconfig(文本选单的配置方式,在有字符终端下才能使用)

make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)

make oldconfig(文本配置方式,在原内核配置的基础修改时使用)

这里使用make menuconfig命令。

1> [*]Enable loadable module support--->

[*]Forced module loading

[*]Module unloading

2> System Type--->

S3C2410 Machines--->

[*]SMDK2410/A9M2410选上 其余不选

S3C2440 Machines--->

[*]SMDK2440

[*]SMDK2440 with S3C2440 CPU module,其余不选

其余的Machines下选项全部不选(如2400241224422443

3> Kernel Features--->

[*]Use the ARM EABI to compile the kernel

注:如果所使用的的交叉编译arm-linux-gcc-4.3.2是符合EABI标准交叉编译器,对于浮点运行会预设硬浮点运算FPA(Float Point Architecture),而没有FPACPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制,使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。

4> Boot options-

noinitrd root=/dev/mtdblock3 init=/linuxrc  console=ttySAC0

5> Userspace binary formats--->

[*]Kernel support for ELF binaries

其它的可以全部不选。

6> 选择支持yaffs2文件系统

Filesystem--->

Miscellaneous filesystems--->

<*>YAFFS2 file system support

[*] Lets Yaffs do its own ECC

Native language support

<*> Codepage 437 (United States,Canada)

<*>Simplified Chinese charset(GB2312)

<*>Traditional Chinese charset(Big5)

<*>NLS ISO 8859-1(Latin1:Western European Languages)

<*>NLS UTF-8

配置完成以后,我们就可以通过make ARCHarm CROSS_COMPILE=arm-linux- 命令生成我们需要的zImage镜像文件了,然后再通过mkimage工具生成可以由u-boot直接引导的uImage镜像文件了。

说明:原始的linux内核是不支持Yaffs2文件系统的,关于文件系统的支持和制作参见本博其他文章。

阅读(2269) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~