(一)目的
在进行嵌入式开发的时候,我们往往会先在电脑上安装交叉编译器,然后编译目标板上的代码,最后把代码下载到电路板中,嵌入式系统组成包括:BootLoader+kernel+filesystem+application,前面我们已经制作好了BootLoader,这一节我们制作一个kernel镜像
(二)工具
- linux-3.5版本内核
- Ubuntu 16.04
- linux交叉编译环境(我已经安装过,没有安装的可以下载arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)
这里说明一点我们获取linux内核一般可以从linux官方获取,或者从开发板的厂商那获取,我比较推荐第二种,因为第一种还需要我们进行有关硬件的配置
(三)操作流程
1、将linux-3.5-20141114.tar拷贝到Linux系统中
2、解压linux-3.5-20141114.tar
tar -xvf linux-3.5-20141114.tar
3、进入解压后的目录
make menuconfig:打开配置界面,若无法打开需要安装库
apt install ncurses-dev
运行make menuconfig打开上面的窗口可以进行内核功能的删减
按下面的步骤修改一个地方:
System Type --->
[ ] Support TrustZone-enabled Trusted Execution Environment //按空格取消该模块
4、修改内核的顶层Makefile
因为最终内核运行到arm开发板,编译需要在PC端,所以需要使用到交叉编译器,在Makefile里指定交叉编译器为arm-linux-
5、拷贝Linux3.5目录下的tiny4412_linux_defconfig为默认配置文件
cp tiny4412_linux_defconfig .config
6、编译内核
make -j8
若出现一下错误:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/driver/linux-3.5/kernel/Makefile:133: recipe for target 'kernel/timeconst.h' failed
make[1]: *** [kernel/timeconst.h] Error 255
make[1]: *** 正在等待未完成的任务....
修改kernel/timeconst.pl的373行:
if (!defined(@val)) {
@val = compute_values($hz);
}
为
if (@val) {
@val = compute_values($hz);
}
7、烧写内核到SD卡
编译完成会提示:Kernel: arch/arm/boot/zImage is ready
将SD卡插入读卡器并连接到Ubuntu
cd arch/arm/boot
dd iflag=dsync oflag=dsync if=./zImage of=/dev/sdb seek=1057
大概持续40秒
8、验证是否烧写成功
将SD卡拔出插到自己的开发板上验证,启动后在串口里会提示内核启动的流程即为成功