乐于分享
好东西不私藏

嵌入式软件工程师面试准备:SDK与文件系统移植方向

嵌入式软件工程师面试准备:SDK与文件系统移植方向
Hello,大家好,我是程序媛MM。

本文约2300字,考察是否学会了最好的方法就是做题和考试,无论是否需要参加面试,定期自我考察一下。本文整理了嵌入式SDK与文件系统移植方向的面试题与学习计划,后续对部分知识细分梳理。

关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。

面向岗位:嵌入式软件工程师(SDK / 文件系统 / BSP 移植方向)
难度预估:中高级(1-5年经验)
目标:从基础补全到高频面试题实战,系统性拿下Offer


一 岗位核心能力拆解

在准备之前,先明确这个岗位到底要我们会什么。
面试官最看重的三个能力层级:

  1. ✅ 能看懂并裁剪现有 SDK(芯片厂商提供的 Software Development Kit)
  2. ✅ 能移植文件系统到不同存储介质(NAND、eMMC、Nor Flash、SD 卡)
  3. ✅ 能调试底层启动 / 存储相关 Bug(UBoot、内核、驱动、根文件系统)

一句话总结:
需要懂芯片启动流程 + 存储介质特性 + 文件系统原理 + 实际移植踩坑经验。


二 必学知识清单(按优先级排序)

🔹 第一梯队:基础且必问

类别
具体内容
面试常考形式
C语言
指针函数、函数指针、回调函数、内存布局(堆/栈/全局/常量)、volatile、static、const
手写代码、指出错误
存储基础
NOR vs NAND、eMMC vs SD、SLC/MLC/TLC、块/页/擦除块、坏块管理
概念对比、选型场景
文件系统基础
FAT32、exFAT、ext2/3/4、YAFFS2、JFFS2、UBIFS、SPIFFS
各自优缺点与应用场景
启动流程
ROM Boot → BootROM → SPL → UBoot → Kernel → RootFS
画流程图、讲清楚每个阶段做了什么

🔹 第二梯队:移植实战技能

  • SDK 结构理解:Makefile / Kconfig / 交叉编译工具链 / 目录划分
  • UBoot 移植:板级配置文件修改、设备树(DTS)、存储驱动(MMC/NAND)
  • Linux 内核配置:MTD 子系统、块设备驱动、文件系统类型编译进内核或模块
  • 文件系统生成工具:mkfs.ubifs、ubinize、mkyaffs2image、mkfs.ext4、dd
  • 根文件系统构建:BusyBox、Buildroot基本概念

🔹 第三梯队:进阶与调试能力

  • Flash 特有机制:磨损均衡、垃圾回收、断电恢复、写放大
  • 性能分析:读写速度测试、mount 时间、随机写入抖动
  • 异常调试:Magic Number 错误、CRC 校验失败、UBI volume 损坏修复
  • 其他 RTOS 文件系统:littlefs(用于 Zephyr/RT-Thread)、FatFs(裸机)

三 10道高频面试真题(带答题要点)

1. NAND Flash 和 NOR Flash 的区别?选型时怎么考虑?

答要点:

  • NOR 支持 XIP(片上执行),读快、擦写慢、容量小
  • NAND 容量大、擦写快、有坏块
  • 选型:代码存储用 NOR(UBoot、小内核),大容量数据用 NAND / eMMC

2. 为什么要引入 UBIFS 而不是继续用 YAFFS2?

答要点:

  • YAFFS2 专为 NAND 设计,但 mount 慢、内存占用高
  • UBIFS 通过 UBI 层处理坏块和磨损均衡,对大页 NAND、多核、高并发更友好

3. 文件系统移植后,kernel 启动报 VFS: Unable to mount root fs,你会怎么排查?

答要点(三步走):

  1. 检查内核是否编译进该文件系统驱动
  2. uboot 传递的 root= 参数是否正确(设备节点或分区名)
  3. 确认镜像烧录位置与分区表一致

4. 简述一下从 SDK 到能跑起一个自定义根文件系统的完整步骤。

答要点(以 Linux 为例):
配置交叉工具链 → 配置 Uboot 支持板载 MMC/NAND → 配置 Kernel 开启所需驱动 → 用 Buildroot 或手动制作 rootfs → 烧录 → 启动调试


5. 什么是坏块管理?文件系统层还是驱动层做?

答要点:

  • 物理坏块由驱动 / FTL 层标记跳过
  • 逻辑坏块由文件系统(如 UBIFS)处理
  • 二者配合

6. 硬链接与软链接在嵌入式文件系统中的应用区别?

答要点:

  • 硬链接:不能跨设备、不能链接目录
  • 软链接:可跨分区,但目标删除后失效
  • 嵌入式常用软链接减少冗余(如 /bin 指向 busybox)

7. 如果要把一个 SD 卡文件系统从 FAT32 换成 ext4,需要改哪些地方?

答要点:

  • 内核配置添加 ext4
  • 修改 UBoot 中 load 命令的分区类型
  • 根文件系统中的 fstab 或 mount 命令
  • 应用程序中的路径权限

8. 你如何处理文件系统意外断电后的数据一致性问题?

答要点:

  • 使用日志型文件系统(ext4、UBIFS)
  • 硬件上加掉电检测与电容保护
  • 关键文件用 sync 或 fsync

9. 交叉编译文件系统工具(如 mkfs.ubifs)时,需要注意什么?

答要点:

  • 注意 mtd-utils 依赖库(zlib、lzo、uuid)
  • 与目标系统的页大小、擦除块大小、LEB 大小匹配

10. 给定一块新的 ARM 板子和 SDK,你预估移植文件系统要多久?

答要点(按经验拆解,不同芯片以及是否有经验时间不同):

从下面几个点来预估:

  • 编译环境搭建
  • sdk编译
  • 内核配置
  • rootfs 制作
  • 第三方库编译

四 系统性学习计划(每天2-3小时)

第 1 周:夯实存储与文件系统理论

  • 阅读《Linux 设备驱动》的 MTD 章节
  • 对比 NAND/NOR/eMMC 资料整理成表格
  • 学习 YAFFS2 vs UBIFS 设计思想
  • 练习:用 qemu 模拟 vexpress 板,跑通裸 kernel + initramfs

第 2 周:UBoot 与内核启动流程

  • 实际编译 UBoot 到一块真实板
  • 分析 uboot 阶段存储驱动初始化流程(mmc rescan、nand init)
  • 练习:修改 uboot 环境变量从不同分区启动 kernel

第 3 周:根文件系统制作(手工 + Buildroot)

  • 用 BusyBox 制作最小根文件系统
  • 对比 initramfs 与磁盘根文件系统的差异
  • 构建一个完整的 Buildroot 工程,加入 ssh、ntp 等工具

第 4 周:真实环境移植(建议购置 Linux 开发板)

  • 完全重做:SDK → Uboot → Kernel → Rootfs
  • 尝试更换文件系统类型(ext4 → UBIFS)
  • 调试一次 kernel panic - not syncing: VFS 类错误

第 5 周:源码级调试与性能测试

  • 学习使用 iozone、dd 进行文件系统性能测试
  • 模拟掉电测试(突然拔电,观察文件系统是否损坏)
  • 阅读 MTD/UBIFS 内核关键函数(ubifs_mount、ubi_attach)

第 6 周:刷题 + 模拟面试

  • 反复练习前面 10 道真题
  • 整理移植过程中的踩坑文档(写在简历中会加分)
  • 参与一次模拟面试(同行或 AI 扮演面试官)

五 额外加分项(面试实战tips)

  1. 务必准备一个完整的移植项目
    从拿到 SDK 到系统跑起来,梳理 5-8 个关键 commit 级步骤
    现场可以说出:改了哪个 dts、加了什么 config、烧录命令是什么

  2. 学会“带书面试”
    准备好关键截图(bootlog、分区表、mount 输出),展示远比空讲有力

  3. 主动展示调试思维
    被问到不会的问题时:

    “以我的经验,我会先从 xxxx 日志分析,再用 xxxx 工具定位”

  4. 了解行业热门趋势
    很多公司在转 SPI NAND + littlefs,或关注 RUST 在文件系统层的应用
    准备 2 句观点就能拉开差距


六 最后一句提醒

嵌入式文件系统移植面试不考花哨算法,
考的是踩过坑后的真判断。
建议至少在真实板子上成功移植并跑坏过一次文件系统,
那种经历比任何八股文都值钱。


祝你早日拿下嵌入式 Offer! 💪

如果有帮助,欢迎转发给正在准备嵌入式面试的朋友。

往期文章(欢迎订阅技术分享栏目全部文章):


【从零开始撸内核驱动源码】:以ttyserial(串口驱动)为例,串联字符设备驱动基础知识点的学习计划
Linux内核源码顶层 Makefile分析并单独编译调试内核自带的驱动
【从零开始撸内核驱动源码】:ttynull驱动
Linux内核驱动安装失败问题调试及解决方法
Linux内核驱动源码走读之编译内核及外部驱动实操指南

“谢谢你看到这里”

这里是女程序员的笔记本

 15年+嵌入式软件工程师兼二胎宝妈

分享读书心得、工作经验,自我成长和生活方式。

希望我的文字能对你有所帮助

相关学习资料