【正点原子I.MX6ULL】从零构建:交叉编译环境搭建与U-boot、Linux内核编译实战

📅 2026/7/14 0:20:52 👁️ 阅读次数 📝 编程学习
【正点原子I.MX6ULL】从零构建:交叉编译环境搭建与U-boot、Linux内核编译实战

1. 交叉编译环境搭建全攻略

第一次接触嵌入式Linux开发的朋友,看到"交叉编译"这个词可能会有点懵。简单来说,这就是在电脑上编译出能在开发板运行的代码。就像你在中国用中文写菜谱,让美国厨师能照着做出地道中餐——我们需要一套翻译工具,这就是交叉编译工具链。

我用的Ubuntu 20.04系统,建议新手也选这个版本,社区支持完善。先检查下你的系统是否安装了这些基础依赖:

sudo apt update sudo apt install build-essential make libncurses5-dev libssl-dev

正点原子提供的工具链是gcc-linaro-4.9.4版本,解压时要注意权限问题。我遇到过因为直接用root解压导致后续权限混乱的情况,建议这样操作:

sudo tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz -C /opt

环境变量配置是新手最容易出错的地方。除了.bashrc里的PATH设置,还要特别注意ARCH和CROSS_COMPILE这两个变量。有次我调试一整天才发现是CROSS_COMPILE少写了结尾的横杠。正确的配置应该是:

export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export PATH=$PATH:/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

验证环节千万别跳过。先执行arm-linux-gnueabihf-gcc -v,应该能看到类似这样的输出:

gcc version 4.9.4 (Linaro GCC 4.9-2017.01)

2. U-boot编译那些坑

解压uboot源码包时,-j参数要根据你的CPU核心数调整。我的六核机器用tar -jxvf uboot-imx... -j6能快不少。进入源码目录后,这三个命令顺序不能错:

make distclean make mx6ull_alientek_emmc_defconfig make

第一次编译时卡在"Multiple definitions of yylloc"错误,查资料发现是flex版本问题。解决方法:

sudo apt install flex bison make distclean

编译成功的标志是生成u-boot.bin文件,大小约380KB。用ls -lh u-boot*查看文件详情时,注意修改时间应该是刚刚生成的。有次我发现文件没更新,原来是忘了先make clean。

3. Linux内核编译实战

解压内核源码建议新建专门目录,我习惯放在~/linux/kernel。重点说下.config文件配置:

make imx_alientek_emmc_defconfig make menuconfig

menuconfig界面里,这几个选项要特别注意:

  • System Type -> Freescale MXC Support
  • Device Drivers -> Network device support
  • File systems -> 根据需求选EXT4/NFS等

编译命令里的-j4参数很关键,能大幅缩短时间。但遇到机器卡顿时要降低并行数:

make zImage -j$(nproc) make dtbs

常见错误处理:

  1. 缺少lzop:sudo apt install lzop
  2. 证书错误:在menuconfig里关闭MODULE_SIG选项
  3. 空间不足:至少预留15GB磁盘空间

4. 成果验证与部署

编译产物要特别注意路径:

  • zImage: arch/arm/boot/zImage
  • dtb: arch/arm/boot/dts/imx6ull-alientek-emmc.dtb

部署前建议先用file命令检查文件类型:

file zImage # 应显示"Linux kernel ARM boot executable zImage"

我习惯用tftp传输,先建立专用目录并设置权限:

mkdir ~/tftpboot chmod 777 ~/tftpboot cp zImage imx6ull-alientek-emmc.dtb ~/tftpboot

开发板启动时,在U-boot界面输入这些命令测试:

setenv serverip 192.168.1.100 setenv ipaddr 192.168.1.101 tftp 80800000 zImage tftp 83000000 imx6ull-alientek-emmc.dtb bootz 80800000 - 83000000

如果启动卡住,可能是设备树不匹配。这时要检查开发板型号和dtb文件是否对应。正点原子不同批次板子可能有细微差别,最好核对下板子上的丝印型号。