之前咸鱼上搞了一块友善之臂2416的开发板,最近周末折腾折腾。搞嵌入式时间也不长,自己的感觉是搞嵌入式linux开发的第一步不是写代码,而是交叉编译、系统移植这些基础工作,只有熟悉了交叉编译,才能验证写出了的代码。因为想折腾一下子驱动开发,驱动代码需要放在linux内核/drivers/char目录下编译,所以先尝试一下linux 内核源码编译,本文记录一下内核编译过程以及遇到的问题。
友善之臂的光盘中提供了linux-3.6内核,如果没有可以到友善的官网去下载,友善之臂官网下载地址。
获得内核压缩包后进行解压。
tar xvzf linux-3.6-20130826.tar.gz
cd linux-3.6
友善之臂提供了内核配置文件mini2451_linux_config,执行以下命令来使用缺省配置文件 mini2451_linux_config。
cp mini2451_linux_config .config
然后执行以下命令配置内核
make menuconfig
执行后出现以下错误:
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
说明缺少ncurses,我的是ubuntu 系统,执行以下命令安装ncurses。
sudo apt-get install ncurses-dev
安装完成后重新执行make menuconfig命令会出现内核配置界面
这时不用做任何更改,在主菜单里选择退出,这样做是为了生成相应配置的头
文件。
交叉编译器使用的是arm-linxu-gcc 4.4.3,编前需要修改linux目录下的makefile,设置交叉编译工具链前缀,修改位置为197行CROSS_COMPILE,修改前:
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
修改后
CROSS_COMPILE ?= arm-none-linux-gnueabi-
执行make开始编译,make前先clean一下。
make clean
make
编译的过程中出现了如下错误:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/home/zhy/code/liunx/friendly2416/linux-3.6/kernel/Makefile:133: recipe for target 'kernel/timeconst.h' failed
参照网上博客解决办法,将kernel/timeconst.pl中第373行的defined()去掉,只留下 !@val 就可以了,修改前:
@val = @{$canned_values{$hz}};
if (!defined(@val)) {
@val = compute_values($hz);
}
output($hz, @val);
修改后:
@val = @{$canned_values{$hz}};
if (!@val) {
@val = compute_values($hz);
}
output($hz, @val);
编译会持续比较长的一段时间,在编译的过程中再未出现错误,编译成功后会出现一下log。
编译结束后,会在 arch/arm/boot 目录下生成 linux 内核映象文件zImage,把这个文件烧到开发中就可以测试运行了。烧写方法可以参照友善之臂的用户手册中《5.3 烧写 Superboot 到 SD 卡》这一章的内容,把SD卡中images/Linux目录下zImage替换成自己编译的zImage就可以了。
编译内核错误:recipe for target ‘kernel/timeconst.h’ failed