ubuntu18.04交叉编译linux3.6内核

之前咸鱼上搞了一块友善之臂2416的开发板,最近周末折腾折腾。搞嵌入式时间也不长,自己的感觉是搞嵌入式linux开发的第一步不是写代码,而是交叉编译、系统移植这些基础工作,只有熟悉了交叉编译,才能验证写出了的代码。因为想折腾一下子驱动开发,驱动代码需要放在linux内核/drivers/char目录下编译,所以先尝试一下linux 内核源码编译,本文记录一下内核编译过程以及遇到的问题。

1 linux内核源码下载

友善之臂的光盘中提供了linux-3.6内核,如果没有可以到友善的官网去下载,友善之臂官网下载地址。
获得内核压缩包后进行解压。

tar xvzf linux-3.6-20130826.tar.gz
cd linux-3.6

2 内核配置

友善之臂提供了内核配置文件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命令会出现内核配置界面
ubuntu18.04交叉编译linux3.6内核_第1张图片

这时不用做任何更改,在主菜单里选择退出,这样做是为了生成相应配置的头
文件。

3 交叉编译

交叉编译器使用的是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。
ubuntu18.04交叉编译linux3.6内核_第2张图片

编译结束后,会在 arch/arm/boot 目录下生成 linux 内核映象文件zImage,把这个文件烧到开发中就可以测试运行了。烧写方法可以参照友善之臂的用户手册中《5.3 烧写 Superboot 到 SD 卡》这一章的内容,把SD卡中images/Linux目录下zImage替换成自己编译的zImage就可以了。

4 参考文章

编译内核错误:recipe for target ‘kernel/timeconst.h’ failed

你可能感兴趣的:(arm开发板,ubuntu,linux,交叉编译)