编译内核


本篇博客讲了怎么样成功编译内核,编译的内核不一定能用.不讲怎么修改内核

1/安装交叉编译器及编译内核所需工具

  • 交叉编译工具链环境的搭建__1

  • 安装工具

sudo apt-get install libncurses5-dev
sudo apt-get install u-boot-tools

2/获取内核源码

源码位置

具体选择哪个源码,选择稳定版本的吧.

3/清理内核目录

如果不是第一次编译内核文件,首先要

make mrproper

2/配置 ARCH 与 CROSS_COMPILE

export ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

可以通过修改Makefile 来表面避免在shell 下输入这条命令,不过一般不建议修改Makefile

3/make xxx_defconfig

  • arm芯片对应的配置文件在arch/arm/configs/目录下

  • 根据你芯片的型号选择一个配置文件,就是和你芯片名称最相似的文件,并拷贝到顶层目录为.config

  • 这个是粗略的确定下编译内核前的配置


会在顶层目录 生成 一个 .config 文件,这个就是配置的主要结果.

这些 arch/arm/configs/ 下的 xxx_defconfig 对应的是一个开发板,可以说是一个母版.
  
怎么确定找哪个 xxx_defconfig,

硬件说板子是抄的 A板子,A板子抄的是 B 板子,刚好,B板子在内核中对应一个 xxx_defconfig
那么 你就用 B板子对应的 xxx_defconfig,即 make xxx_defconfig

例如
    make vexpress_ca9x4_defconfig



4/make menuconfig

  • 这个是细致的确定下编译内核前的配置,如果不想细致,可以不做
这个操作会改变 顶层目录 下 的 .config
最终生成的.config 应该匹配你的板子

操作效果
读入当前目录下的.config
会生成一个界面,让你选择一些东西,去选择一些东西.
当退出的时候,保存,就会写入.config
  
这个过程是最复杂的,你的99.9%的时间都应该花在这上面,这里面涉及一些改源码(主要是驱动源码)之类的.


5/make uImage

make  uImage//现在 arm 的板子也可以用 Image 了,具体待研究.
该步骤会在arch/arm/boot/文件夹下生成一个uImage文件,该文件就是内核镜像

//如果有编译机器是8核的话,可以用 make uImage -j8


编译常见问题
  • 在Ubuntu 64位环境下编译Liunx内核出现 Can’t use ‘defined(@array)’ 错误的解决办法

uImage和zImage

uIamge是由zImage 经工具mkimage制作而来的,制作的过程就是压缩

uboot目前只能支持uImage启动,不支持zImage启动

bootm加载linux镜像,加载的是uIamge,bootm需要先对uIamge解压,解压地址为内核入口地址。当解压完成时uIamge和zIamge几乎是相同的,差别是uImage比zImage多64字节

//多出的64字节
2705 1956 fad0 6c19 58d0 99f5 0030 c588
8000 8000 8000 8000 c959 2892 0502 0200
4c69 6e75 782d 332e 302e 3800 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

你可能感兴趣的:(linux-build)