news 2026/5/6 4:15:55

保姆级教程:在复旦微FMQL开发板上,从编译内核到SD卡启动Linux的完整流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:在复旦微FMQL开发板上,从编译内核到SD卡启动Linux的完整流程

复旦微FMQL开发板实战:从内核编译到SD卡启动Linux的全流程指南

第一次接触复旦微FMQL开发板时,那种既兴奋又忐忑的心情至今记忆犹新。作为嵌入式Linux开发的新手,面对陌生的开发环境和复杂的工具链,我曾在无数个深夜与各种编译错误和启动失败作斗争。本文将分享我在FMQL平台上从零开始构建Linux系统的完整经验,特别针对那些刚入门嵌入式开发的工程师和学生,提供一份真正"手把手"式的实操指南。

1. 开发环境准备与基础概念

在开始实际操作前,我们需要先理解几个关键概念。复旦微FMQL平台采用的是一种典型的嵌入式Linux开发流程,涉及内核编译、根文件系统构建和最终镜像打包三个主要环节。与常见的x86平台不同,嵌入式系统通常需要我们自己构建所有组件。

1.1 必备工具与软件安装

首先确保你的开发主机满足以下要求:

  • 操作系统:推荐使用Ubuntu 18.04/20.04 LTS(本文以Ubuntu 20.04为例)
  • 磁盘空间:至少50GB可用空间
  • 内存:建议8GB以上
  • 基础工具链
sudo apt update sudo apt install -y build-essential git flex bison libssl-dev libncurses5-dev

对于FMQL平台,还需要准备:

  • 交叉编译工具链:arm-linux-gnueabihf-
  • 复旦微提供的SDK:FMQL-Linux-SDK(包含内核、uboot、buildroot等)
  • 串口调试工具:minicom或picocom

提示:建议在纯净的Ubuntu系统或虚拟机中进行开发,避免因环境冲突导致难以排查的问题。

1.2 理解Linux镜像格式

在嵌入式领域,我们会遇到多种内核镜像格式,每种都有其特定用途:

格式名称描述适用场景
Image原始内核镜像直接引导加载
zImage压缩的内核镜像节省存储空间
uImageU-Boot专用格式传统U-Boot引导
image.ubFIT格式镜像现代U-Boot引导,支持设备树和多重配置

FMQL平台推荐使用image.ub(FIT格式),因为它可以整合内核、设备树和根文件系统到一个文件中,简化启动流程。

2. 内核编译与配置

2.1 获取与准备内核源码

复旦微提供的Linux内核源码位于SDK的linux-4.14.55-fmsh目录中。首先需要设置环境变量:

cd FMQL-Linux-SDK source env.sh

这个env.sh脚本会设置必要的环境变量,包括交叉编译工具链路径等。验证环境是否配置正确:

echo $CROSS_COMPILE # 应显示arm-linux-gnueabihf-

2.2 内核配置与编译

进入内核源码目录并开始配置:

cd linux-4.14.55-fmsh make fmsh_fmql_defconfig

这个命令会加载复旦微提供的默认配置。如果需要自定义内核功能:

make menuconfig

在出现的图形界面中,可以启用或禁用特定驱动和功能。对于初次尝试,建议先使用默认配置。

开始编译内核(根据你的CPU核心数调整-j参数):

make -j$(nproc)

编译完成后,生成的镜像文件位于:

arch/arm/boot/zImage

注意:编译过程中可能会提示缺少某些依赖库,根据错误信息安装相应软件包即可。

2.3 常见问题解决

在实际操作中,可能会遇到以下问题:

  1. 编译错误:通常是由于工具链不匹配或缺少依赖库导致

    • 解决方案:仔细阅读错误信息,安装缺失的软件包
    • 示例:sudo apt install libssl-dev
  2. 环境变量未生效:导致使用主机工具链而非交叉编译工具链

    • 解决方案:确认已执行source env.sh,并检查$CROSS_COMPILE变量
  3. 配置丢失:修改配置后未保存

    • 解决方案:使用make savedefconfig保存最小配置

3. 构建根文件系统

3.1 Buildroot基础

FMQL SDK使用Buildroot来构建根文件系统。Buildroot是一个自动化构建嵌入式Linux系统的工具,可以生成:

  • 交叉编译工具链
  • 根文件系统
  • 内核镜像
  • 引导加载程序

SDK中的Buildroot位于buildroot-2018.02.3目录。

3.2 配置与编译

设置环境变量(如果尚未设置):

cd FMQL-Linux-SDK source env.sh

进入Buildroot目录并配置:

cd buildroot-2018.02.3 make fmsh_tiny_defconfig

这个配置会生成一个最小化的根文件系统。如果需要添加额外软件包:

make menuconfig

开始编译:

make

编译完成后,生成的根文件系统位于:

output/images/rootfs.cpio.gz

3.3 文件系统定制

如果需要定制根文件系统,可以考虑以下方式:

  1. 添加用户软件包

    • 在menuconfig中选择需要的软件包
    • 或创建自定义package
  2. 修改文件系统骨架

    • 编辑board/fmsh/skeleton目录下的文件
  3. 添加启动脚本

    • board/fmsh/post-build.sh中添加自定义命令

提示:首次尝试建议使用默认配置,成功启动后再考虑定制。

4. 制作FIT镜像(image.ub)

4.1 FIT镜像原理

FIT(Flattened Image Tree)是一种灵活的镜像格式,它使用设备树语法来描述和包含多个二进制组件。一个典型的FIT镜像可以包含:

  • 内核镜像
  • 设备树文件
  • 根文件系统
  • 其他二进制资源

4.2 准备必要文件

制作image.ub需要以下文件:

  1. 内核镜像zImage(来自内核编译)
  2. 设备树system-top.dtb
  3. 根文件系统rootfs.cpio.gz(来自Buildroot)
  4. 配置文件fitImage.its

将这些文件复制到FMQL-Linux-SDK/images目录:

cp linux-4.14.55-fmsh/arch/arm/boot/zImage images/ cp buildroot-2018.02.3/output/images/rootfs.cpio.gz images/ # 假设设备树文件已存在

4.3 配置与生成

编辑env.sh文件,确保以下设置:

IMAGE_TYPE="ramdisk"

生成image.ub:

./build.sh image

生成的镜像位于:

image/image.ub

4.4 FIT镜像高级配置

如果需要自定义FIT镜像,可以编辑conf/fitImage.its文件。主要配置节点包括:

  • images:定义包含的各个二进制组件
  • configurations:定义不同的启动配置

示例配置片段:

/dts-v1/; / { description = "FMQL Linux Kernel"; #address-cells = <1>; images { kernel@1 { description = "Linux Kernel"; data = /incbin/("./zImage"); type = "kernel"; arch = "arm"; os = "linux"; compression = "none"; load = <0x80008000>; entry = <0x80008000>; }; ... }; ... };

5. 制作SD卡启动盘

5.1 SD卡分区方案

FMQL开发板需要特殊格式的SD卡才能启动,典型分区方案如下:

分区文件系统大小内容
1FAT321GBBOOT.bin, image.ub
2EXT4剩余空间根文件系统(可选)

5.2 使用命令行分区

在Ubuntu中,可以使用fdisk工具进行分区:

sudo fdisk /dev/sdX # 替换为你的SD卡设备

常用fdisk命令:

  • n:创建新分区
  • t:更改分区类型(1为FAT32,c为W95 FAT32 LBA)
  • w:写入更改

创建文件系统:

sudo mkfs.vfat -F 32 /dev/sdX1 sudo mkfs.ext4 /dev/sdX2

5.3 复制启动文件

挂载FAT32分区并复制必要文件:

sudo mount /dev/sdX1 /mnt sudo cp BOOT.bin /mnt/ sudo cp image/image.ub /mnt/ sync sudo umount /mnt

警告:确保复制的是最新生成的BOOT.bin和image.ub,错误的版本会导致启动失败。

6. 启动与调试

6.1 硬件连接

  1. 将制作好的SD卡插入开发板
  2. 连接串口线到主机
  3. 设置启动模式开关为SD卡启动
  4. 连接电源

6.2 串口终端设置

使用minicom连接串口:

sudo minicom -D /dev/ttyUSB0 -b 115200

常见串口配置参数:

  • 波特率:115200
  • 数据位:8
  • 停止位:1
  • 无奇偶校验
  • 无流控

6.3 启动过程分析

成功启动时,串口终端会显示类似以下信息:

U-Boot 2018.01 (Mar 20 2023 - 15:30:25 +0800) DRAM: 1 GiB MMC: zynq_sdhci: 0 In: serial Out: serial Err: serial Net: zynq_gem Hit any key to stop autoboot: 0 Loading Environment from SPI Flash... OK ## Loading kernel from FIT Image at 10000000 ...

如果启动失败,常见的排查步骤:

  1. 检查串口连接是否正确
  2. 确认SD卡分区和文件格式正确
  3. 验证BOOT.bin和image.ub版本匹配
  4. 检查环境变量设置(特别是bootcmd)

6.4 常见启动问题

  1. 卡在U-Boot阶段

    • 可能原因:BOOT.bin损坏或版本不匹配
    • 解决方案:重新生成并复制BOOT.bin
  2. 内核panic

    • 可能原因:根文件系统加载失败
    • 解决方案:检查image.ub中的根文件系统路径
  3. 无法识别SD卡

    • 可能原因:SD卡槽接触不良或供电不足
    • 解决方案:重新插拔SD卡,检查电源

7. 进阶配置与优化

7.1 内核参数调整

通过U-Boot可以传递额外的内核参数:

setenv bootargs console=ttyPS0,115200 root=/dev/ram0 rw saveenv

常用内核参数:

  • console:指定控制台设备
  • root:指定根文件系统位置
  • init:指定init程序路径
  • loglevel:控制内核日志级别

7.2 永久性环境变量

在U-Boot中设置永久环境变量:

setenv ipaddr 192.168.1.100 setenv serverip 192.168.1.1 setenv bootcmd 'fatload mmc 0 0x10000000 image.ub; bootm 0x10000000' saveenv

7.3 性能优化技巧

  1. 内核尺寸优化

    • 移除不需要的驱动和功能
    • 启用内核压缩(如LZMA)
  2. 启动时间优化

    • 使用静态设备树(避免运行时加载)
    • 预初始化关键硬件
  3. 根文件系统优化

    • 使用更小的C库(如musl代替glibc)
    • 移除调试符号

8. 开发工作流建议

经过多次项目实践,我总结出以下高效开发流程:

  1. 版本控制

    • 对SDK进行git初始化:git init
    • 创建独立分支进行修改:git checkout -b my-feature
  2. 自动化脚本: 创建build.sh脚本自动化常见任务:

    #!/bin/bash source env.sh cd linux-4.14.55-fmsh && make -j$(nproc) && cd .. cd buildroot-2018.02.3 && make && cd .. ./build.sh image
  3. 增量开发

    • 先确保最小系统能启动
    • 逐步添加所需功能
    • 每次修改后验证基本功能
  4. 备份策略

    • 定期备份工作镜像
    • 对关键里程碑打tag

遇到最棘手的问题是在一个项目中,系统随机性启动失败。经过两周的排查,最终发现是SD卡接触不良导致的。这个教训让我明白:在嵌入式开发中,90%的"软件问题"实际上可能是硬件问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 4:15:15

Museeks疑难解答:常见问题解决方案和故障排除

Museeks疑难解答&#xff1a;常见问题解决方案和故障排除 【免费下载链接】museeks &#x1f3b5; A simple, clean and cross-platform music player 项目地址: https://gitcode.com/gh_mirrors/mu/museeks Museeks是一款简洁、跨平台的音乐播放器&#xff0c;为用户提…

作者头像 李华
网站建设 2026/5/6 4:15:07

在多轮对话应用中感受Taotoken聚合端点的响应连贯性

在多轮对话应用中感受Taotoken聚合端点的响应连贯性 1. 多轮对话应用场景概述 开发需要持续交互的聊天应用时&#xff0c;对话上下文的连贯性直接影响用户体验。我们基于Taotoken平台构建了一个多轮对话演示应用&#xff0c;通过聚合端点调用同一模型进行长时间会话测试。测试…

作者头像 李华
网站建设 2026/5/6 4:11:01

从回环到生发,老子三句话照进 SAP ABAP 开发现场

老子说,反者道之动。弱者道之用。天下万物生於有,有生於无。放到 SAP ABAP 开发里看,这不是一句离工程很远的玄言,而像一条很朴素的系统生存法则。一个长期运行的 SAP 系统,不是靠代码堆得越来越厚来变强,也不是靠增强点、隐式修改、复制标准程序、硬编码配置来证明自己有…

作者头像 李华
网站建设 2026/5/6 4:10:55

CipherScan高级功能实战:STARTTLS、SNI和代理支持

CipherScan高级功能实战&#xff1a;STARTTLS、SNI和代理支持 【免费下载链接】cipherscan A very simple way to find out which SSL ciphersuites are supported by a target. 项目地址: https://gitcode.com/gh_mirrors/ci/cipherscan CipherScan是一款功能强大的SSL…

作者头像 李华
网站建设 2026/5/6 4:06:48

ComfyUI Essentials终极指南:如何用3分钟补齐ComfyUI缺失的核心功能

ComfyUI Essentials终极指南&#xff1a;如何用3分钟补齐ComfyUI缺失的核心功能 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials 如果你在使用ComfyUI进行AI绘画时&#xff0c;经常感觉某些基础功能不够用&#…

作者头像 李华