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。