Linux内核的编译(ARM-Linux)

首先,要有一个内核文件,比如我的是Linux-2.6.38,当然如果要选择Linux版本的话,应了解相应Linux版本的基础知识:

Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3组数字组成:第一位数.第二位数.第三位数

第一位数:目前发布的内核主版本。

第二位数:偶数表示稳定版本;奇数表示开发中版本。

第三位数:版本的发布号。

例1:Linux 2.6.38 ,

 第一位数:   2 , 主版本号

 第二位数:   6 , 次版本号,表示稳定版本(因为是偶数)

 第三位数:38 , 版本的发布号。

所以在选择Linux时,应选择一个较稳定版本的Linux内核,即第二位数为偶数的Linux版本。

 

  在编译Linux内核时,需要配置内核,可以使用以下指令中的一个:

make config
make menuconfig
make xconfig
make gconfig

其中,config是基于文本的最为传统的配置界面,不推荐使用;menuconfig是基于文本菜单的配置界面;xconfig要求QT被安装;gconfig要求GTK+被安装。

 

一开始我傻乎乎的在U-boot文件夹下使用命令,用了好几次发现一直不对。。。

可能很多人会在编译内核和模块的时候发现很多问题,在这里我也简单地列举下,我遇到的几个问题和最终解决的方法。

1、make xxx_defconfig时,出现错误。

我在~/linux-2.6.38/arch/arm/configs中,找到了s3c6400_defconfig,然后我在终端打开该文件夹

cd /root/linux-2.6.38/arch/arm/configs
#错误的

然后出现了两个错误,第一个是我按照教程执行 make s3c6400_defconfig 时出现错误“make: 没有什么可以做的为 `s3c6400_defconfig'。”

第二个是我试了下 make menuconfig 时出现错误“make: *** 没有规则可以创建目标“menuconfig”。 停止。”

而后,我在网上搜索原因,我发现我打开的文件夹是错的,应该打开Linux内核文件夹。

所以,解决方案也很简单,如下:

cd /root/linux-2.6.38
#make s3c6400_defconfig #开始写的是这个后来发现友善之臂的这个居然没有LCD驱动,所以用的是
cp config_mini6410_a70 .config

当然,也简单解释一下,cd 后面跟的是你Linux内核文件夹的地址!make 后面跟的是你要的XXX的默认配置文件

2、在执行make zImage时出错,错误提示如下:

cc1: error: unrecognized command line option "-mlittle-endian"
cc1: error: unrecognized command line option "-mapcs"
cc1: error: unrecognized command line option "-mno-sched-prolog"
kernel/bounds.c:1:0: error: unknown ABI (apcs-gnu) for -mabi= switch
kernel/bounds.c:1:0: error: bad value (armv4t) for -march= switch
kernel/bounds.c:1:0: error: bad value (arm9tdmi) for -mtune= switch
make[1]: *** [kernel/bounds.s] 错误 1
make: *** [prepare0] 错误 2

之后发现是gcc路径错误。

更改也显得比较容易,不过比较坑爹,有几个点需要注意。

如果和我一样是arm-linux交叉编译的话,首先在终端运行

arm-linux-gcc -v

在我的电脑是提示是这样的:

Using built-in specs.
COLLECT_GCC=arm-linux-gcc
COLLECT_LTO_WRAPPER=/opt/opt/FriendlyARM/toolschain/4.5.1/bin/../libexec/gcc/arm-none-linux-gnueabi/4.5.1/lto-wrapper
Target: arm-none-linux-gnueabi

请看清楚上面两个点:一个是COLLECT_GCC,一个是COLLECT_LTO_WRAPPER。这两个解决这个问题的关键。

如果不是做的arm-linux交叉编译的话,也一样找到gcc和对应路径。

然后,打开linux内核文件夹(如我的是在/root/linux-2.6.38)下的makefile找到如下这么一段:

*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
#ARCH        ?= $(SUBARCH)
ARCH        ?= arm
CROSS_COMPILE    ?= $(CONFIG_CROSS_COMPILE:"%"=%)

将其进行修改,改成如下:

*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
#ARCH        ?= $(SUBARCH)
ARCH        := arm
CROSS_COMPILE    := GCC的地址/GCC名去掉结尾GCC后剩余部分
#请拷贝修改的时候通过一下大脑。。。

例如,我的修改好后是这样的:

*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
#ARCH        ?= $(SUBARCH)
ARCH        := arm
CROSS_COMPILE    := /opt/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-

我们可以看到CROSS_COMPILE后面跟的是之前需要特别之一的两个点,一个是COLLECT_GCC,一个是COLLECT_LTO_WRAPPER。

CROSS_COMPILE后面的部分就是COLLECT_LTO_WRAPPER的地址部分,加上斜杠‘/’,再加上COLLECT_GCC中gcc前面的部分,如我的是arm-linux-gcc,所以最后跟的是arm-linux-。

当然,请拷贝修改的时候开动一下大脑,完全拷贝是没有用的,路径是不同的。。。。

3、在执行make zImage时再次出错,出现error: 'TASK_INTERRUPTIBLE' undeclared (first use in this function)等一大串的东西,这个解决比较简单,只需要在对应C文件,加上头文件 #include 就可以解决了。

 

之后运行:

make zImage
make modules

就可以在源代码根目录下生成未压缩的内核映像vmlinux和内核富豪表文件system.map,以及arch/arm/boot下得到的压缩的内核映像zImage。

 

你可能感兴趣的:(Linux内核的编译(ARM-Linux))