顶部纪律提示镜像布局、文件系统的起始扇区与对齐、主控启动命令地址,以具体平台启动加载器(U-Boot / Bootloader)的配置与器件 datasheet 为准;本文仅展示机制与排查思路,所有数值、偏移、对齐粒度均须回查对应平台的官方资料。
SD NAND 镜像扇区错位 · 量产排查
编制日期 2026-09-21 | 版本号 Rev 1.0
XTX 芯天下存储芯片 FAE · 量产烧录问题排查手册
TOP 1
烧录故障首位:扇区偏移错位
具体占比以实际产线统计为准
±1
起始扇区错 1 → 全盘镜像全错
sector 为绝对定位
4K / 32MB
文件系统起始扇区对齐粒度
实际以 datasheet 为准
dd
最快定位:全盘镜像比对
烧录器 vs 主控双视角
8 类
典型错位场景覆盖
第 1 类 ~ 第 8 类
这份文档解决什么解决一类高频量产故障:烧录成功、校验通过,但贴板后系统找不到 bootloader / kernel / 文件系统 / 应用程序。根因几乎都落在「镜像扇区偏移错位」——烧录地址与主控期望地址不一致。
一句话结论:SD NAND 烧录 = 按扇区写镜像;烧录起点扇区号错 1,整个镜像全错。 先把烧录器写出的盘与「期望布局」用 dd 全盘镜像比对,是最快定位手段。
一、问题本质
SD NAND(如 XTX 的 XT26G、XT26C 系列)的烧录逻辑与 SD 卡一致:以 512 B 为一个 sector,按绝对扇区号寻址写入整片镜像。因此「扇区号」是镜像在器件上的唯一绝对坐标——起点错一处,全盘皆错。
关键认知镜像烧录后能否被主控识别,不取决于「文件内容对不对」,而取决于「字节落在哪个 sector」。校验通过只是证明「写进去的字节与源文件一致」,并不证明「写到了正确的 sector」。
六 种典型数据画像
| # | 数据画像 | 现象 | 最可能根因类目 |
|---|---|---|---|
| 1 | 完全黑屏 | 串口无输出 / 上电无反应 | 第 1 / 2 类 · 整体偏移 / 启动扇区 |
| 2 | 卡 logo | 停在开机画面不动 | 第 2 / 3 类 · 启动扇区 / 分区表 |
| 3 | Kernel panic | 内核启动即崩溃 | 第 1 / 7 类 · 整体偏移 / 启动地址 |
| 4 | 文件系统挂不上 | VFS / mount 失败 | 第 4 类 · 文件系统起始扇区不对齐 |
| 5 | 应用崩溃 | 系统起来但 App 异常 | 第 5 / 6 类 · 分片顺序 / 对齐填充 |
| 6 | 偶发扇区读错 | 时好时坏 / 随机数据坏 | 第 8 类 · FTL 坏块 / 物理映射 |
危险纪律(量产现场务必遵守)
- SD NAND 烧录等于按扇区写镜像,扇区号是绝对定位——任何「相对地址」的假设都会错位。
- 烧录起点扇区号错 1,整个镜像全错;不要凭经验估算起始 sector。
- 文件系统起始扇区必须对齐到合理粒度(典型 4K / 32MB,以 datasheet 为准)。
- 主控的 bootcmd / loadaddr 期望地址必须与镜像实际烧入地址一致。
- 定位第一步:在 SD NAND 上
dd出全盘镜像与期望布局比对,而非反复改烧录脚本盲试。
二、镜像布局总览
标准 SD NAND 系统盘通常按固定顺序排布若干分区。理解这条「从 sector 0 开始的链条」,是定位一切偏移错位的前提。
| 分区 | 典型起始位置 | 作用 | 错位后果 |
|---|---|---|---|
| MBR | sector 0 | 主引导记录 / 分区表 | 主控找不到任何可启动内容 → 黑屏 |
| Boot | MBR 之后固定扇区 | SPL / U-Boot 等二级引导 | 卡在最早启动阶段 |
| Kernel | 由 Boot 加载 | Linux 内核镜像 | Kernel panic / 起不来 |
| Rootfs | Kernel 指定地址 | 根文件系统(ext4 / UBI) | 文件系统挂不上 |
| Data | Rootfs 之后 | 用户数据 / 应用 | 应用崩溃 / 配置丢失 |
布局铁律MBR 必须位于 sector 0;后续各分区起始扇区由镜像布局单源定义,且必须满足对齐要求。布局一旦在「烧录脚本」与「主控配置」两处出现分歧,就会表现为本文所述各类错位。
三、第 1 类 镜像整体偏移错位
最典型、也最致命:烧录脚本把镜像起点写到了错误的绝对 sector,导致「镜像整体相对期望布局平移了 N 个扇区」。结果:每个分区都没落在主控期望的地址上。
机理
- 绝对地址 vs 相对地址:主控从固定 sector 读取 MBR/Boot/Kernel;若烧录起点错 1 扇区,全盘内容相对期望地址整体右移,主控读到的全是「错位后的错误字节」。
- 烧录起点错 1 扇区就全错:SD NAND 没有「自动校正偏移」的机制,镜像里的 boot 签名、kernel 头、分区表全部落在错误位置。
危险操作在定位清楚前,不要为了「试一下」而整片擦除 SD NAND 后反复烧录——这会破坏现场证据(原始偏移无从比对)。正确做法:先
dd 备份当前全盘镜像,再比对。立即动作
- 在故障板上
dd if=/dev/<sd_nand> of=bad.img bs=512备份全盘(以实际设备节点为准)。 - 用正常板 / 标准镜像同样
dd出 good.img。 cmp -l bad.img good.img | head找到首个差异字节,换算成扇区偏移。- 核对烧录脚本的起始 sector 参数,确认是否与标准布局一致。
四、第 2 类 启动扇区写入错位
SD NAND 的 sector 0 是 MBR(或等效保留区)。某些主控还期望特殊 ID / 签名出现在某个固定偏移。若启动扇区被写到了别的 sector,主控上电后读 sector 0 拿到的是无效内容,直接卡死在最早阶段(完全黑屏 / 卡 logo)。
典型表现
| 现象 | 说明 |
|---|---|
| 上电无任何串口输出 | sector 0 不是合法 MBR / 引导签名 |
| 卡在 SPL / 最早启动阶段 | 二级引导被写到非期望扇区 |
| 主控要求特殊 ID 偏移缺失 | 签名位置与烧录布局不符 |
注意部分平台在 sector 0 之外还有「保留扇区 / 配置扇区」,其偏移与内容由厂商规定。该区域的写入位置与字节必须以具体平台启动加载器与 datasheet 为准,不可照搬其它平台经验。
立即动作
- 确认平台要求 MBR / 引导签名所在的确切 sector(查 U-Boot / Bootloader 文档)。
hexdump -C -n 512 bad.img查看 sector 0 是否为合法 MBR。- 比对 good.img 的 sector 0,确认签名 / 分区表位置是否一致。