首先,要有一个内核文件,好比个人是Linux-2.6.38,固然若是要选择Linux版本的话,应了解相应Linux版本的基础知识:
Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3组数字组成:第一位数.第二位数.第三位数linux
第一位数:目前发布的内核主版本。app
第二位数:偶数表示稳定版本;奇数表示开发中版本。ui
第三位数:版本的发布号。this
例1:Linux 2.6.38 ,spa
第一位数: 2 , 主版本号code
第二位数: 6 , 次版本号,表示稳定版本(由于是偶数)blog
第三位数:38 , 版本的发布号。教程
因此在选择Linux时,应选择一个较稳定版本的Linux内核,即第二位数为偶数的Linux版本。开发
在编译Linux内核时,须要配置内核,能够使用如下指令中的一个:get
make config
make menuconfig
make xconfig
make gconfig
其中,config是基于文本的最为传统的配置界面,不推荐使用;menuconfig是基于文本菜单的配置界面;xconfig要求QT被安装;gconfig要求GTK+被安装。
一开始我傻乎乎的在U-boot文件夹下使用命令,用了好几回发现一直不对。。。
可能不少人会在编译内核和模块的时候发现不少问题,在这里我也简单地列举下,我遇到的几个问题和最终解决的方法。
一、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的默认配置文件
二、在执行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= switchkernel/bounds.c:1:0: error: bad value (armv4t) for -march= switchkernel/bounds.c:1:0: error: bad value (arm9tdmi) for -mtune= switchmake[1]: *** [kernel/bounds.s] 错误 1make:*** [prepare0] 错误 2
以后发现是gcc路径错误。
更改也显得比较容易,不过比较坑爹,有几个点须要注意。
若是和我同样是arm-linux交叉编译的话,首先在终端运行
arm-linux-gcc -v
在个人电脑是提示是这样的:
Using built-inspecs.
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-。
固然,请拷贝修改的时候开动一下大脑,彻底拷贝是没有用的,路径是不一样的。。。。
三、在执行make zImage时再次出错,出现error: 'TASK_INTERRUPTIBLE' undeclared (first use in this function)等一大串的东西,这个解决比较简单,只须要在对应C文件,加上头文件 #include 就能够解决了。
以后运行:
make zImage
make modules
就能够在源代码根目录下生成未压缩的内核映像vmlinux和内核富豪表文件system.map,以及arch/arm/boot下获得的压缩的内核映像zImage。