1. VxWorks存储工程全景

在嵌入式实时系统中,存储从来不是“插上一块盘就能读写文件”这么简单。VxWorks 的存储工程本质上是一条从物理介质到应用接口的纵向栈:最底层是 NAND/NOR Flash、eMMC、SD 卡、SATA/NVMe 盘或 RAM 盘等硬件介质;其上是控制器与总线驱动;再往上是块设备层与 Flash 转换层(FTL);然后是文件系统层;最上层才是应用可见的 POSIX 文件接口。理解这条栈的每一层职责、接口边界与性能特征,是后续做分区规划、掉电保护、寿命管理和性能调优的前提。

一、分层架构:五层模型与接口边界

把 VxWorks 存储栈抽象为五层,便于定位问题与划分职责:

  • 介质层:NAND Flash(页/块结构、需擦除、有坏块)、NOR Flash(可字节寻址、支持 XIP)、eMMC/SD(内置控制器与 FTL)、SATA/NVMe(块寻址、自带磨损均衡)、RAM 盘(易失、极快)。
  • 控制器/总线驱动层:NAND 控制器、SDHC/eMMC 控制器、AHCI/NVMe 驱动,负责时序、DMA、中断与命令队列。
  • 块设备层:向上提供统一的块读写接口(如 VxWorks 的 blkDev 抽象),屏蔽介质差异;对裸 NAND 还需 FTL 完成逻辑块到物理页的映射、坏块管理与磨损均衡。
  • 文件系统层:dosFs(FAT)、TrueFFS/HRFS(面向 Flash)、以及只读的 romFs 等,负责目录、文件、簇/块分配与元数据一致性。
  • 应用接口层:POSIX 风格的 open/read/write/close、ioctl,以及 VxWorks 特有的 dosFsVolFormat、dosFsShow 等工具接口。

关键边界在于:文件系统只认“块”,它不关心块来自 NAND 还是 eMMC;而FTL 只认“页/块”,它把 NAND 的物理约束翻译成稳定的逻辑块。因此,选型时若介质自带 FTL(eMMC/SD/SSD),文件系统可直接架在块设备上;若用裸 NAND,则必须由 TrueFFS 或自研 FTL 承担这一层,否则文件系统会因坏块和擦除特性而失效。

VxWorks 存储工程五层架构与数据流 应用接口层 open / read / write / close / ioctl · dosFsVolFormat · dosFsShow POSIX 语义 文件系统层 dosFs (FAT) · TrueFFS / HRFS · romFs · 目录/簇分配/元数据一致性 逻辑块视图 块设备层 / FTL blkDev 抽象 · 逻辑块↔物理页映射 · 坏块管理 · 磨损均衡 块寻址 控制器 / 总线驱动层 NAND 控制器 · SDHC/eMMC 控制器 · AHCI/NVMe 驱动 · DMA/中断 命令/时序 硬件介质层 NAND Flash · NOR Flash · eMMC / SD · SATA / NVMe · RAM 盘 物理特性 数据流方向:应用 → 介质 注:eMMC/SD/SSD 自带 FTL,可跳过独立 FTL 层;裸 NAND 必须由 TrueFFS 或自研 FTL 承担映射与坏块管理

二、核心组件与选型逻辑

VxWorks 存储工程的核心组件可归为四类:介质驱动、FTL、文件系统、工具与诊断。选型时先看介质是否自带 FTL,再看文件系统是否需要掉电一致性,最后看性能与寿命约束。

以一块 256 MB 裸 NAND(页 2 KB、块 128 KB、共 2048 块)为例,若直接暴露给 dosFs,则文件系统按 512 B 扇区读写,每次写都要先擦除 128 KB 块,且坏块会导致地址错位。因此必须引入 TrueFFS:它把 2048 个物理块映射为逻辑块,保留若干备用块用于坏块替换,并在后台做磨损均衡。假设坏块率 2%,则约 41 个块不可用,备用块池需预留 3%~5%(约 60~100 块)才能保证长期可靠。这些参数不是实测值,而是工程估算的典型量级,实际应以介质手册和老化测试为准。

若换成 8 GB eMMC,其内部控制器已提供 FTL、坏块管理和磨损均衡,VxWorks 侧只需 eMMC 驱动 + 块设备层 + dosFs 即可。此时文件系统看到的是一块“理想块设备”,选型重点转向分区对齐、写入放大和掉电保护策略。

三、典型应用场景与配置取向

场景介质文件系统关键取向
工业控制器参数存储NOR Flash / 小容量 NANDTrueFFS + dosFs掉电一致性、小文件频繁改写
车载数据记录eMMC / SDdosFs (FAT32)顺序写吞吐、断电后目录可恢复
只读固件镜像NOR FlashromFsXIP、零拷贝、不可修改
临时缓存/日志RAM 盘dosFs极高 IOPS、掉电即失
大容量视频存储SATA/NVMe SSDHRFS / dosFs高带宽、队列深度、TRIM

以车载数据记录为例,典型配置是:eMMC 划分为两个分区,第一个 512 MB 放系统与配置(dosFs,只读挂载),第二个 7 GB 放循环日志(dosFs,读写挂载)。日志按 4 MB 文件滚动,每写满一个文件调用 fsync 或 ioctl(FIOFLUSH) 刷盘,避免掉电时元数据损坏。若实测顺序写带宽为 20 MB/s,则 7 GB 可记录约 350 秒满速数据;实际按 2 MB/s 平均码率,可覆盖约 1 小时。这些数字用于说明容量与带宽的换算方法,并非特定硬件实测结果。

四、从硬件到文件系统的数据流与故障定位

一次 write() 的完整路径是:应用缓冲区 → 文件系统缓存/簇分配 → 块设备层请求 → 控制器 DMA → 介质编程。若写失败,可按层排查:应用层看返回值与 errno;文件系统层用 dosFsShow 看剩余空间与簇链;块设备层看请求是否下发;控制器层看超时与 ECC 错误;介质层看坏块与寿命。把这条链画清楚,排障时就不会在错误的层反复折腾。

工程建议:新项目先确定“介质是否自带 FTL”和“是否需要掉电一致性”两个问题,再选文件系统。裸 NAND 优先 TrueFFS,eMMC/SD 优先 dosFs,只读镜像优先 romFs,临时数据优先 RAM 盘。

综上,VxWorks 存储工程的全景可以概括为:介质决定约束,FTL 决定可靠性,文件系统决定接口与一致性,应用决定访问模式。四者匹配,存储栈才能既实时又可靠。