i.MX6ULL 嵌入式 Linux 系统移植

适用正点原子 I.MX6ULL‑MINI/ALPHA(512MB DDR3L、eMMC 版本),完整覆盖环境准备、三大镜像、3 种烧录模式、U‑Boot、内核编译、rootfs、SD 卡分区布局、uboot 环境变量、常见错误排查,所有操作均标注风险点,防止配置错误。

一、系统移植基础概念

1、Linux 系统由 3 部分组成,缺一不可

组件 文件名称 作用
U‑Boot(bootloader) u‑boot.imx 上电初始化硬件 DDR / 时钟,加载内核、传递启动参数,引导 Linux 内核启动
Linux 内核 zImage + xxx.dtb设备树 内核实现内存管理、进程调度、网络、虚拟文件系统;Linux3.0 以后硬件资源独立为设备树 dtb 文件,不再编译进 zImage
根文件系统 rootfs rootfs.tar.bz2 用户态程序、库、配置脚本,提供人机交互,内核挂载后才有 shell 终端

完整启动链路 :U‑Boot → zImage + dtb设备树 → rootfs根文件系统

2、开发板启动拨码开关(eMMC 版本,0 代表 OFF,1 代表 ON)

(1)USB 启动 (烧录模式):01000000:用于 mfgtool 通过 OTG 烧写系统

烧写 SD 卡:开发板先上电识别设备,之后再插入 SD 卡

烧写 EMMC:上电前拔掉 SD 卡,否则识别失败

(2)SD 卡启动 (开发调试):10000010:系统放在 SD 卡,开发阶段频繁调试使用

(3)EMMC 启动 (产品量产):10100110:系统固化板载 eMMC,脱离 SD 卡独立运行

硬件注意:OTG 口只负责数据通信,开发板必须外接 12V 电源适配器供电,不能依靠 USB 线供电

3、SD 卡存储布局(imx6mksdboot.sh 脚本生成)

位置 内容说明
0 扇区(512 字节) MBR 分区表
1KB 偏移处开始 存放 U‑Boot(IVT/DCD/uboot 本体,最大 1MB),禁止改写 SD 卡前两个扇区,会破坏分区表
分区 1 FAT32(64MB) 挂载 /boot;存放zImage、imx6ull‑alientek‑emmc.dtb
分区 2 EXT3(剩余全部空间) 挂载 /;完整 rootfs 根文件系统,包含 bin、etc、lib、usr、modules 内核模块

4、三种烧录模式对比

模式 使用场景 优缺点
模式 1:烧写至 SD 卡 前期开发、系统恢复、裸机后跑 Linux 简单;SD 卡速度有限,不适合量产
模式 2:烧写至板载 eMMC 产品量产,最终交付版本 固化到板载存储,脱离 SD 卡;烧录时间约 5 分钟
模式 3:SD 卡存 uboot + TFTP 下载 zImage/dtb + NFS 挂载 rootfs 驱动开发高频调试(最推荐开发模式) 不需要反复烧写存储介质;修改内核 / 设备树 / 根文件直接在 Ubuntu 服务器替换,重启板子即生效;依赖网络环境

二、前期 Ubuntu 开发环境搭建

1、双网卡虚拟机配置(重中之重,极易出错)

目标:网卡 1 NAT 模式,访问外网 apt 下载软件;网卡 2 桥接模式,直连开发板网线,作为 TFTP/NFS 服务器。

(1)VMware 添加 2 块网络适配器

  • 适配器 1:NAT 模式,负责访问互联网
  • 适配器 2:桥接模式,桥接到电脑有线网卡(不要桥接 WiFi) ,静态 IP:192.168.1.100,子网掩码255.255.255.0,网关192.168.1.1

VMnet0必须桥接到以太网接口,后续才能与开发板通信

2、必须安装全套工具

复制代码
#串口工具 minicom
sudo apt‑get install minicom
#TFTP服务器
sudo apt‑get install tftpd‑hpa tftp
#NFS服务器
sudo apt‑get install nfs‑kernel‑server
#编译uboot、内核依赖
sudo apt‑get install libncurses5‑dev bison flex lzop
#ctags代码阅读
sudo apt‑get install ctags cscope
① minicom 串口配置
复制代码
sudo minicom -s
Serial port setup:
Serial Device:`/dev/ttyUSB0`
Bps/Par/Bits:`115200 8N1`
Hardware Flow Control:**No(关闭硬件流控!不关闭串口无输出)**
Save setup as dfl,保存默认配置。
退出:`Ctrl+A`,按下`Q`。

Windows 端可以使用 MobaXterm,COM 口,波特率 115200,流控 None。

② TFTP 服务器配置

配置文件 /etc/default/tftpd‑hpa

复制代码
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/linux/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure‑l‑c"

创建目录赋权限

复制代码
mkdir /home/linux/tftpboot
chmod 0777 /home/linux/tftpboot
sudo service tftpd‑hpa restart

把zImage、dtb放到该目录,开发板 uboot 通过 tftp 下载。

③ NFS 服务器配置

编辑/etc/exports

复制代码
/home/linux/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)

no_root_squash:开发板 root 用户拥有服务器目录权限,开发调试必须;生产环境不建议。

复制代码
mkdir -p /home/linux/nfs/rootfs
chmod 0777 /home/linux/nfs /home/linux/nfs/rootfs
sudo service nfs‑kernel‑server restart
#验证共享目录是否生效
showmount -e
④ 交叉工具链配置

工具链:gcc‑linaro‑4.9.4‑2017.01‑x86_64_arm‑linux‑gnueabihf.tar.xz 解压,添加 PATH 环境变量,写入~/.bashrc末尾

复制代码
export PATH=$PATH:/home/linux/tools/opt/gcc‑linaro‑4.9.4‑2017.01‑x86_64_arm‑linux‑gnueabihf/bin

生效:source ~/.bashrc 验证:arm‑linux‑gnueabihf‑gcc -v

三、模式一:烧写系统到 SD 卡(Windows MfgTool / Ubuntu 脚本两种方案)

Windows MfgTool 烧写 SD 卡

重要避坑清单

  • mfgtool 解压路径绝对不能有中文、空格,推荐放在 D 盘根目录,使用 7‑zip/WinRAR 解压,不要 Windows 自带解压,长文件名会解压失败。
  • 关闭 VMware 虚拟机!!! 防止 OTG 设备被虚拟机抢占,Windows 设备管理器识别到「符合 HID 标准的供应商定义设备」才算识别成功。
  • 开发板拨码:USB 启动01000000,12V 电源接好,OTG Type‑C 连接 PC;上电之后再插入 SD 卡!!!
  • 双击脚本:Mfgtool2‑eMMC‑ddr512‑SDCard.vbs
  • 点击 Start,等待约 5 分钟烧录完成。
  • 烧录完成断电,修改拨码为 SD 卡启动模式,重新上电,串口即可看到 Linux 启动日志。

Ubuntu 脚本烧写 SD 卡

  • SD 卡插入读卡器接入虚拟机,查看设备名:sudo fdisk -l,确认 SD 卡为/dev/sdb(⚠️千万不要写成系统硬盘 /dev/sda!!!会销毁电脑系统)

  • 将 mfgtool 中Profiles/Linux/OS Firmware/files文件夹拷贝到 Ubuntu。

  • 修复脚本 bug:imx6mksdboot.sh第 221 行变量名PARITION2修改为PARTITION2。

  • 执行烧录脚本

    sudo ./imx6mksdboot.sh -device /dev/sdb -flash emmc -ddrsize 512

脚本执行完毕,SD 卡拔出插到开发板,拨码切 SD 卡启动,上电启动。

四、模式二:烧写系统到 eMMC(量产模式)

Windows MfgTool 烧写 eMMC

  • mfgtool 路径无中文,关闭虚拟机。
  • 开发板:拨码 USB 启动01000000,上电前拔掉 SD 卡,12V 供电,OTG 接 PC。
  • 双击脚本Mfgtool2‑eMMC‑ddr512‑eMMC.vbs
  • 识别设备后点击 Start,等待约 5 分钟烧录结束。
  • 断电,拨码修改为 EMMC 启动模式,上电运行。

Ubuntu 下烧写 eMMC

⚠️不能直接脚本写 eMMC;需要先 SD 卡启动开发板,板子 Linux 系统运行后,再执行烧写脚本。

  • 先把 SD 卡烧写出厂系统,SD 卡启动开发板。

  • 网线连接虚拟机与开发板,minicom 串口连接。

  • 开发板挂载 Ubuntu 的 NFS 共享目录

    mount -o nolock,rw,nfsvers=3 192.168.1.100:/home/linux/nfs/rootfs /mnt

files 文件夹放到 nfs 共享目录;在开发板终端(minicom)进入 /mnt/files,给脚本增加执行权限,运行:

复制代码
chmod +x imx6mkemmcboot.sh
./imx6mkemmcboot.sh -device /dev/mmcblk1 -ddrsize 512

烧录完成断电,拨码切换 EMMC 启动。

五、模式三:网络开发模式(SD 卡存 U‑Boot,TFTP 下载内核 DTB,NFS 挂载 rootfs)【驱动开发首选】

优势:修改 zImage、dtb、rootfs,直接替换 Ubuntu 服务器文件,重启板子即可生效,不需要反复烧写 Flash。

步骤

  1. 使用模式一把 uboot 烧写到 SD 卡,开发板拨码 SD 卡启动。

  2. 将编译得到zImage、imx6ull‑alientek‑emmc.dtb拷贝到 Ubuntu 的/home/linux/tftpboot目录。

  3. 将rootfs.tar.bz2解压到/home/linux/nfs/rootfs目录(解压务必加 sudo,权限不会出错)

    sudo tar -xvf rootfs.tar.bz2

  4. 开发板上电,串口按任意键进入 U‑Boot 命令行。

  5. 配置 uboot 环境变量(IP 地址按自己的实际网段修改!!!)

    env default -a #恢复uboot默认环境变量
    saveenv
    #网络参数
    setenv ipaddr 192.168.1.50 #开发板IP
    setenv ethaddr 00:04:9f:04:d2:35 #MAC地址,不要重复
    setenv gatewayip 192.168.1.1
    setenv netmask 255.255.255.0
    setenv serverip 192.168.1.100 #Ubuntu虚拟机IP
    saveenv
    #bootcmd:uboot倒计时自动执行,tftp下载zImage、dtb到DDR内存
    setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull‑alientek‑emmc.dtb;bootz 80800000 - 83000000'
    saveenv
    #bootargs:内核启动参数,nfs挂载根文件系统,必须指定nfsvers=3
    setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/linux/nfs/rootfs,proto=tcp,nfsvers=3 rw ip=192.168.1.50:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'
    saveenv
    reset #重启开发板,自动网络启动Linux

验证网络:uboot 命令行执行 ping 192.168.1.100,必须 ping 通,否则 tftp/nfs 全部失败。uboot 下 ping 只能开发板 ping 虚拟机,虚拟机 ping 不通开发板,单向通信属于正常现象。

六、U‑Boot 编译(i.MX6ULL)

解压 uboot 源码

复制代码
tar -zxvf uboot.tar.gz
cd uboot

编译命令

复制代码
#清理
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ distclean
#加载默认配置
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ imx6ull_alientek_emmc_defconfig
#编译,‑j16根据CPU核心数调整
make V=0 ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ -j16

输出产物:顶层目录 u‑boot.imx(给 i.MX 芯片烧录的完整镜像,包含 IVT/DCD 头信息)。

i.MX6ULL 启动三阶段回顾

  • ROM (iROM) 阶段:芯片内部固化 ROM,上电运行,读取启动介质前 4KB 的 IVT/DCD,初始化基础时钟,把 SPL 加载到 OCRAM 片上 SRAM(仅 128KB)。
  • SPL 第一阶段 U‑Boot:运行片内 OCRAM;初始化 DDR 内存,把完整 uboot 拷贝到 DDR(0x87800000)。
  • 第二阶段 U‑Boot :DDR 内存运行;初始化外设,提供命令行,加载 zImage/dtb,调用bootz启动 Linux 内核。

U‑Boot 高频核心命令

  1. 环境变量:printenv查看、setenv设置、saveenv保存到存储介质

  2. 网络:ping、tftp 内存地址 文件名、nfs

  3. MMC 操作:

    mmc dev 0 #SD卡
    mmc dev 1 #eMMC
    fatload mmc 1:1 80800000 zImage #从mmc1的分区1读取zImage到DDR内存

启动命令: bootz 80800000 - 83000000:启动 zImage,

第二个参数 initrd 填‑代表无 ramdisk,

第三个参数 dtb 地址。

boot:执行 bootenv 中 bootcmd 环境变量。

七、Linux 内核编译(版本 Linux4.1.15)

复制代码
tar -zxvf linux‑imx‑rel_imx_4.1.15_2.1.0_ga_alientek.tar.gz
cd linux‑imx‑rel_imx_4.1.15_2.1.0_ga_alientek
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ distclean
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ imx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ menuconfig #图形化裁剪内核
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ all -j16

编译输出产物:

  1. 内核镜像:arch/arm/boot/zImage
  2. 设备树二进制:arch/arm/boot/dts/imx6ull‑alientek‑emmc.dtb

拷贝到 tftpboot 目录,供开发板下载:

复制代码
cp arch/arm/boot/zImage ~/tftpboot/
cp arch/arm/boot/dts/imx6ull‑alientek‑emmc.dtb ~/tftpboot/

内核启动流程简述

head.S(_stext入口) → start_kernel() → rest_init() → kernel_init() → 挂载rootfs → 执行init进程,启动用户空间

八、rootfs 根文件系统

解压 rootfs.tar.bz2,NFS 模式必须解压到 nfs 共享目录,解压必须 sudo,否则权限丢失。 rootfs 启动流程 内核挂载 rootfs → 执行linuxrc → /etc/inittab → /etc/init.d/rcS → mount‑a 读取/etc/fstab挂载各个文件系统 → 启动 shell 交互终端。

/etc/inittab关键:askfirst会打印提示Please press Enter to activate this console,按下回车出现串口命令行。

九、EMMC 启动的 uboot 环境变量参考(烧录到 eMMC 后)

复制代码
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull‑alientek‑emmc.dtb; bootz 80800000 - 83000000;'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

mmc dev 1 代表 eMMC;root=/dev/mmcblk1p2 eMMC 的第二个分区,rootfs 存放位置;rootwait等待存储设备就绪,必须加上,否则内核启动找不到根文件系统。

相关推荐
sunoo-22920 小时前
【嵌入式Linux驱动学习】Day1-Day2 全流程梳理:环境搭建→U-Boot→内核→根文件系统→驱动基础
linux·运维·驱动开发·笔记·学习·阿里云·恩智浦
u1301301 天前
GitHub 热榜项目:日榜(2026-10-07)
驱动开发·github
万物智能信息科技1 天前
血氧心跳传感器MAX30100芯片驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
人工智能·驱动开发·华为·开源·harmonyos·鸿蒙
沫璃染墨3 天前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
ebiobiz3 天前
Zig 工具链编译 STM32 开发指南
驱动开发·stm32·嵌入式硬件
sukalot3 天前
Windows 驱动实例分析系列:libwdi 驱动分析 - 应用篇(一)
windows·驱动开发
Carl_奕然3 天前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
gwf2164 天前
Completion Queue(CQ)与中断处理:轮询、中断聚合与错误码 —— 面向AI集群的驱动级深度剖析
驱动开发·性能调优·pcie·rdma·ai集群·中断聚合·cq
kakakahahahaha4 天前
Windows鼠标失灵排查:Ctrl Alt Delete、Mouse Keys、USB控制器与驱动修复
windows·驱动开发·电脑·笔记本电脑·软件需求