【Linux】imx6ull Kernel 源码获取与编译环境一站式搭建指南

1. 环境准备:搭建编译基础

在开始编译imx6ull内核之前,我们需要先准备好编译环境。这个过程就像盖房子前要打好地基一样重要。我建议使用Ubuntu 18.04或20.04 LTS版本作为开发环境,这两个版本在嵌入式开发中经过广泛验证,稳定性有保障。

首先安装必要的依赖包,打开终端执行以下命令:

sudo apt update sudo apt install -y build-essential libncurses5-dev lzop libssl-dev \ bison flex u-boot-tools git-core gcc-arm-linux-gnueabihf

这些包包含了编译内核所需的各种工具:

  • build-essential:基础编译工具链
  • libncurses5-dev:内核配置菜单界面依赖
  • lzop:内核压缩工具
  • bison/flex:语法分析器
  • u-boot-tools:U-Boot相关工具

安装完成后,建议创建一个专门的工作目录,避免文件散落在各处:

mkdir -p ~/imx6ull/kernel cd ~/imx6ull/kernel

2. 获取交叉编译工具链

imx6ull采用ARM Cortex-A7架构,我们需要对应的交叉编译工具链。这里推荐使用ARM官方提供的gcc-arm-10.2版本,它针对ARMv7架构做了优化。

下载并安装工具链:

wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz tar xvf gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz sudo mv gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf /opt

配置环境变量,编辑~/.bashrc文件:

echo "export PATH=/opt/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/bin:\$PATH" >> ~/.bashrc echo "export ARCH=arm" >> ~/.bashrc echo "export CROSS_COMPILE=arm-none-linux-gnueabihf-" >> ~/.bashrc source ~/.bashrc

验证工具链是否安装成功:

arm-none-linux-gnueabihf-gcc -v

如果看到类似下面的输出,说明工具链配置正确:

gcc version 10.2.1 20201103 (GNU Toolchain for the A-profile Architecture 10.2-2020.11 (arm-10.16))

3. 获取内核源码

imx6ull的内核源码有几个来源,我推荐使用NXP官方维护的版本,它包含了针对imx6ull的优化和补丁。

3.1 从NXP官方仓库获取

使用git克隆源码仓库:

git clone https://github.com/nxp-imx/linux-imx.git -b imx_5.4.70_2.3.0 cd linux-imx

这个版本(5.4.70)是经过NXP验证的稳定版本,适合大多数imx6ull开发板。如果你需要其他版本,可以查看仓库的branch列表。

3.2 源码目录结构解析

了解内核源码目录结构有助于后续的开发和调试:

arch/ # 架构相关代码,我们关注arch/arm drivers/ # 设备驱动 include/ # 头文件 kernel/ # 核心内核代码 mm/ # 内存管理 scripts/ # 编译脚本和工具

4. 配置和编译内核

4.1 基础配置

imx6ull有多个默认配置文件,我们可以根据开发板型号选择:

make imx_v7_defconfig

这个配置适用于大多数imx6ull开发板。如果需要更精细的配置,可以使用菜单界面:

make menuconfig

在菜单界面中,有几个关键选项需要注意:

  • System TypeFreescale MXC/AVIC→ 确保选中i.MX6ULL支持
  • Kernel Features→ 根据需求设置内存布局和启动参数
  • Device Drivers→ 启用开发板所需的外设驱动

4.2 开始编译

使用以下命令开始编译内核:

make -j$(nproc)

这里的-j$(nproc)会根据你的CPU核心数自动设置并行编译任务数,可以显著加快编译速度。编译过程可能需要10-30分钟,取决于你的机器性能。

编译完成后,主要生成以下文件:

  • arch/arm/boot/zImage:压缩的内核镜像
  • arch/arm/boot/dts/*.dtb:设备树二进制文件

4.3 常见编译问题解决

在实际操作中,你可能会遇到这些问题:

  1. 缺少头文件:通常是缺少相关开发包,可以通过apt search查找并安装对应的dev包
  2. 工具链不匹配:确保使用ARMv7架构的工具链,不要误用ARM64版本
  3. 内存不足:可以尝试减少并行任务数,如make -j2

5. 安装和测试内核

5.1 部署内核镜像

将编译好的内核镜像和设备树文件复制到TFTP目录(假设使用TFTP启动):

sudo cp arch/arm/boot/zImage /var/lib/tftpboot/ sudo cp arch/arm/boot/dts/imx6ull-*.dtb /var/lib/tftpboot/

5.2 通过U-Boot加载内核

在U-Boot命令行中,可以使用以下命令加载并启动内核:

tftp 80800000 zImage tftp 83000000 imx6ull-your-board.dtb bootz 80800000 - 83000000

5.3 验证内核版本

系统启动后,可以通过以下命令验证内核版本:

uname -a cat /proc/version

应该能看到类似这样的输出:

Linux imx6ull 5.4.70 #1 SMP PREEMPT Wed Mar 1 12:00:00 CST 2023 armv7l GNU/Linux

6. 进阶配置与优化

6.1 内核模块管理

默认配置下,很多驱动会编译为模块。如果需要内置这些驱动,可以在menuconfig中将对应的选项从M改为*

管理内核模块的常用命令:

make modules # 编译模块 make modules_install # 安装模块到指定目录

6.2 调试符号支持

开发阶段可以启用内核调试符号,方便问题排查:

make menuconfig # 进入 Kernel hacking → 选中Compile the kernel with debug info

6.3 性能优化选项

根据实际需求,可以调整以下配置提升性能:

  • CPU频率调节:选择performance模式
  • 内存配置:优化DMA和缓存设置
  • 文件系统:根据存储介质选择最佳的文件系统选项

7. 设备树定制

imx6ull使用设备树来描述硬件配置,这是嵌入式Linux开发的重要部分。

7.1 修改设备树

设备树源文件位于arch/arm/boot/dts/目录。以imx6ull-14x14-evk.dts为基础,创建你自己的设备树文件:

cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-your-board.dts

然后修改Makefile,添加你的设备树编译目标:

vim arch/arm/boot/dts/Makefile # 在imx6ull-14x14-evk.dtb后添加你的设备树

7.2 常见设备树修改

  1. GPIO配置:调整引脚复用和电气特性
  2. 外设使能:添加或修改SPI、I2C等外设节点
  3. 内存映射:根据实际硬件调整内存地址

修改后需要重新编译设备树:

make dtbs

8. 持续集成建议

对于团队开发,建议设置自动化编译环境:

  1. 使用git管理内核源码和自定义补丁
  2. 编写脚本自动化编译流程
  3. 考虑使用Jenkins或GitHub Actions实现持续集成

一个简单的编译脚本示例:

#!/bin/bash export ARCH=arm export CROSS_COMPILE=arm-none-linux-gnueabihf- make imx_v7_defconfig make -j$(nproc) make dtbs if [ $? -eq 0 ]; then echo "编译成功" cp arch/arm/boot/zImage ../output/ cp arch/arm/boot/dts/*.dtb ../output/ else echo "编译失败" exit 1 fi

经过这些步骤,你应该已经成功搭建了imx6ull的内核编译环境。在实际项目中,可能会遇到各种硬件特定的问题,这时候查看内核文档和社区资源就非常重要了。NXP官方提供的《i.MX Linux Reference Manual》是很好的参考资料,建议下载保存。