尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

高安全设备SLC NAND选型与设计:参考电路、坏块管理到烧录排障

高安全设备SLC NAND选型与设计:参考电路、坏块管理到烧录排障 做安全设备这么久我一直觉得有一个组件被严重低估闪存。安全芯片、国密算法、可信执行环境当然重要但每次有人问我“整条信任链的根到底落在哪”我给出的答案里都会有一块SLC NAND。最近评估了一款面向高安全应用推出的新型SLC NAND闪存系列看到配套的工程样片和可靠性数据正好借这个由头把高安全场景下SLC NAND的选型、电路设计、坏块管理、烧录排障这些事完整梳理一遍。这篇内容适合嵌入式工程师、硬件安全开发者、工业/汽车电子从业者也适合刚接触NAND的入门者。我会先讲清楚为什么高安全设备离不开SLC这种存储介质再拆解NOR和NAND在安全系统里的分工、参考电路设计要点、坏块和ECC那些容易踩的坑最后用一次真实的烧录故障排障过程收尾。全文按我实际项目里的工程视角来写尽量少讲空话多给能直接落地的经验。1. 高安全设备为什么需要SLC NAND三个反直觉的事实1.1 安全性不只是加密算法存储介质的可预测性才是底层保证很多人把“高安全”等同为算法强度高、密钥长度大、通信加密做得好。但如果你站在系统层面看任何一个安全设备最终都要把固件镜像、启动校验码、密钥备份、设备证书、运行日志放到Flash里。存储介质一旦出现不可预测的读错误、写错误或者擦除失败轻则设备启动不了重则让安全机制被迫走到“失败开放”的旁路分支——这是安全认证里最怕出现的情况。SLC NAND的价值在于“可预测”。它每个存储单元只保存1比特分“已擦除”和“已编程”两个状态阈值电压窗口设计得很宽。相比MLC/TLC那种一个单元里塞2比特、3比特甚至更多电平状态的结构SLC的读取电压裕量大得多。这意味着电荷泄漏、读干扰、写干扰造成位翻转的概率显著更低也就意味着整颗芯片的错误模型更简单、更容易被ECC覆盖。我在设计安全审计日志存储时有个很深的体会用SLC时一个4KB逻辑页读出来出现1比特错误是极小概率事件而同样的页面放在TLC上长期高温老化后出现多比特错误的频率会让人睡不着觉。安全设备不允许“大概率没事”它要求的是“在所有边界条件下都能稳定复现预期行为”。1.2 SLC与MLC/TLC/QLC/PLC一字之差寿命和错误率差了一个数量级闪存按每个单元存储的比特数可以分为SLC、MLC、TLC、QLC以及近两年开始出现的PLC。很多人只觉得这是容量成本的区别但在高安全应用里这个区别直接决定了方案能不能通过认证、能不能保证10年生命周期。类型每单元比特数典型P/E寿命(工业级)读干扰敏感度数据保持(高温)典型应用定位SLC16万~10万次低优秀高可靠工业/安全/车规MLC21万~3万次中良好嵌入式存储/部分工业盘TLC33千~5千次高一般固态盘/消费类板载存储QLC41千~2千次更高偏弱大容量读密集应用PLC5数百次(待验证)高偏弱未来大容量存储这个表里的数字是典型范围不代表任何特定厂商型号但数量级是行业共识。在高安全场景寿命不是唯一的理由。MLC/TLC擦写时往往需要更复杂的编程脉冲序列掉电瞬间更容易处于中间状态擦除时间也更长一次擦除操作失败后重试的逻辑更复杂。SLC基本可以做到单页编程即写即验错误恢复路径很短。对于固件升级这种“写入过程中不能中断”的操作这是实打实的安全优势。1.3 数据保持力安全设备10年生命周期绕不开的硬指标安全设备的东西不是用一年两年就换的。POS终端、车规T-Box、工业控制器的设计寿命通常是10年甚至15年。在这期间设备可能没有上电但密钥、证书、配置数据必须保留在Flash里。NAND是靠浮栅或电荷俘获层里的电荷来保存数据的电荷会随时间和温度逐渐泄漏。温度越高泄漏越快擦写次数越多氧化物层损伤越厉害泄漏也越快。SLC因为单元只有两态判定0和1的窗口大所以对电荷泄漏的容忍度远高于MLC/TLC。同样是“数据保持10年”SLC可以在更高的环境温度下达到这个指标。我做过一组加速老化实验把样片写满数据后放在85℃环境箱里烘烤每周回读一次错误率。TLC那片在第四周开始出现可校正的位翻转之后错误数稳步上升同批次工艺下的SLC样片到第八周依然几乎零错误。后来我把这个结论写进了方案的可靠性分析报告里客户非常认可。这也是为什么很多安全认证的BOM里存储介质这一栏默认就是SLC NAND或同等级别的工业级NOR。2. NOR与NAND各有分工安全系统的启动电路与数据区到底怎么分2.1 NOR闪存和NAND闪存的本质差异“NAND flash和NOR flash区别”这个问题几乎是每个硬件工程师的必答题但在高安全应用的语境下答案要落到“分工”上。NOR闪存支持按字节随机读可以直接映射到CPU地址空间代码可以在NOR里原地执行也就是XIP。它的读延迟很低擦写速度却很慢容量做到64MB以上成本就急剧上升。NAND闪存则完全不同它只能按页读、按块擦容量大、写速度相对快、单位比特成本低但必须配控制器做坏块管理和ECC不能直接XIP执行代码。从安全角度看NOR适合放少量关键启动代码NAND适合放大量签名固件、文件系统、日志数据。很多安全MCU的启动流程是片上ROM先验证外部SPI NOR里的低级Bootloader低级Bootloader再去NAND里读取并验证备份Bootloader和系统镜像。这种分层设计既保证了启动链路的安全性又兼顾了容量和成本。2.2 高安全系统的典型存储拓扑小NOR启动 SLC NAND数据区 安全元件我自己做过的一个金融支付终端的存储拓扑可以拿来参考安全元件SE存放根密钥、执行密码运算不直接暴露Flash访问接口。小容量NORSPI NOR或并口NOR存放平台Bootloader、安全启动公钥或公钥哈希。SLC NAND存放主固件A/B镜像、文件系统、审计日志、黑名单、设备证书链。为什么主固件不放NOR因为当前动辄几MB甚至几十MB的固件NOR放不下也不划算。为什么不用eMMCeMMC虽然自带控制器和坏块管理但它的控制器固件相对黑盒在高安全应用里很难确认它是否可靠执行了“物理擦除”和“坏块隔离”。裸SLC NAND加自研或可审计的控制器方案反而更可控也更容易通过安全评估。这种拓扑下BootROM的信任根在MCU内部信任锚是SE里的根密钥和NOR里的公钥NAND则承担“大容量、复用、日志记录”的角色。一旦系统运行起来对NAND的每一次读取都应该走签名校验或MAC校验而不是盲目信任存储内容。2.3 参考电路设计中的引脚级细节我见过太多人画NAND参考电路时只复制Datasheet的典型应用图却漏掉了几个关键细节。这些都是与“rtl8723与nand flash参考电路”这类设计有关的问题。所有控制信号包括CE#、CLE、ALE、WE#、RE#在初始上电后必须保持确定电平不能让它们悬空。很多SoC的GPIO在复位期间是高阻态如果外部没有上拉或下拉NAND可能误判命令状态导致第一次读ID就不稳定。WP#写保护引脚要仔细处理。开发阶段经常需要擦除整个Flash如果WP#被强制拉高很多时序工具会报“擦除失败”。我习惯在板子上给WP#留一个调试跳线或GPIO控制。R/B#引脚是开漏输出必须接上拉电阻否则芯片进入Busy状态后主机读不到状态变化。VCC和VCCQ要分开滤波编程瞬间电流可以达到几十毫安甚至上百毫安如果和WiFi模组共用一个稳压器编程时电压跌落会让NAND写操作和RF射频同时出问题。这也是为什么有些WiFi SoC参考电路里会强调NAND供电独立。这些细节看起来不起眼但在量产中经常是“时好时坏”的元凶。后面第5章我会用一个真实故障案例说明这类问题的定位过程。3. 新型SLC NAND安全特性拆解安全启动、真擦除与防篡改3.1 安全启动信任链里的NAND分区设计高安全设备的启动过程不是简单地把代码读到RAM执行而是一环扣一环的信任验证。一个典型的SLC NAND分区设计长这样分区0Bootloader副本A签名分区1Bootloader副本B签名A/B冗余分区2主固件镜像A签名版本号分区3主固件镜像B分区4系统配置区带CRC或MAC分区5审计日志区只追加写分区6黑名单/策略更新区分区7安全计数器与回滚保护存储区为什么A/B镜像在高安全设备里这么重要因为固件升级是攻击面最大的环节之一。如果升级过程中掉电、写入失败或者验证失败系统必须能回滚到另一个完整副本否则设备就变砖了安全设备变砖意味着不可用不可用在很多场景下等同于安全事件。NAND每个区块的坏块情况不同分区表最好放在固定位置通过多次重复写入和校验来保证可靠性。新型SLC NAND很多支持独立的OTP区域可以把分区表、根公钥哈希这类“只写一次”的数据放进去避免被覆盖。3.2 “真擦除”问题FTL、坏块表与数据残留这是我认为高安全应用里最容易被低估的问题。NAND的擦除操作是按块进行的擦除后一般读到0xFF。但很多设备用了FTL层或文件系统之后用户看到的“删除文件”并不会真正擦除底层物理块。如果日志里包含敏感信息比如设备激活码、密钥片段、交易记录物理块里的数据残留就可能是安全隐患尤其在设备报废返修、二手流通时。要做到“真擦除”需要在控制器或驱动层对逻辑地址对应的物理块发起擦除命令并在擦除后回读全0xFF校验。擦除失败的块必须标记为坏块停止使用不能留在备用块池里。还有一个细节NAND被反复读取时相邻页的电荷状态会对目标页产生读干扰可能让原本已擦除或已写入的数据出现微弱偏移。这不是安全威胁但在“擦除校验”时可能造成误判。所以高安全设备的擦除流程应该尽量短平快不要在擦除后长时间反复读取同一块。3.3 防篡改与防重放存储侧的配合措施安全设备防篡改不只是靠外壳和传感器存储侧也要配合。新型SLC NAND在这方面的趋势是提供几个关键能力OTP/安全寄存器区根密钥、启动公钥、唯一ID只写一次之后锁定。块级硬件写保护可以通过特定命令把某些区域设为只读防止固件被覆盖。唯一设备ID可以作为设备认证的辅助因子和SE一起参与密钥派生提升克隆难度。防重放攻击通常依靠“单调计数器”每次固件升级或安全操作都会递增并把这个计数值固化在存储区。SLC NAND的优势在于计数器所在的物理块可以经受高次数擦写而不坏所以即使频繁升级计数器也很少因为擦写而失效。相比之下如果用高P/E磨损的TLC区域做计数器连续升级几十次之后块就撑不住了。我在自己的设计里习惯把计数器连续写两遍配合CRC启动时读两个副本并取校验通过的那个必要时恢复。这样即使NAND出现个别坏比特也不会让系统直接拒绝启动。4. 坏块管理、ECC纠错和3D NAND高可靠存储最容易忽略的链路4.1 坏块是NAND的天生属性不是制造缺陷第一次用NAND的工程师经常会问新片怎么就有坏块这不是质量问题。NAND工艺为了追求高密度允许出厂时存在少量无效块。每颗芯片出厂时会在第一个有效块或指定位置标记初始坏块信息也就是Factory Bad Block Marker。既然坏块不可避免那么控制器必须做坏块管理。高安全应用里坏块管理策略要保守得多遇到坏块宁可多浪费一点空间也不能影响关键数据的可靠性。SLC的初始坏块比例虽然低但用久了一样会产生运行期坏块。安全设备的固件区如果落到坏块里启动时轻则校验失败重则陷入死循环。所以分区表要有冗余副本关键分区要预留备用块。4.2 坏块标记、替换机制与FTL的配合NAND坏块管理有两种主流思路静态坏块表芯片出厂时扫描整个Flash建立一张“哪些块不能用”的表后续擦写时直接跳过。适合启动代码、只读数据等固定区域。动态坏块管理运行过程中发现擦写失败或写后读回失败则把该块标记为坏块将一个好的备用块映射到原逻辑地址。适合日志区、配置文件等经常改写的数据。高安全设备一般两者都用。启动分区采用静态表保证启动链路稳定日志/计数器区采用动态管理并做多副本冗余。我之前调试过一个问题主控在擦除一个坏块时总是返回错误固件一直重试整个系统卡死。后来加了“连续失败N次就标记坏块并切到备用块”的逻辑问题才解决。这个错看起来很小但在产品里非常致命特别是安全设备需要连续记录日志时一次擦写卡死可能导致整个审计链路中断。4.3 从2D到3DECC能力和管理策略的变化“3D NAND关系”这个词背后是个很实际的工程问题3D堆叠改变了单元结构和电荷耦合方式也让ECC策略跟着变了。2D SLC时代ECC普遍用BCH常见配置是每512字节纠正4位或者每1KB纠正8位。到了3D TLC、QLC时代BCH明显不够用很多控制器转向LDPC软解码。3D结构虽然容量上去了但各层之间的干扰和电荷保持特性更复杂错误率天然比2D高。对于“高端3D SLC”这类产品情况介于两者之间。部分3D SLC仍然可以用BCH覆盖常见错误但为了留余量我会优先选支持LDPC的控制器。不要迷信“SLC不需要好ECC”工艺越先进、容量越大即使是SLCECC能力也该按具体芯片来评估而不是沿用十年前的老配置。我评估一颗新SLC NAND时会先看它的Datasheet推荐ECC强度再用实际读取错误分布来做最终决定。原则很简单可纠正的错误率要至少留出30%以上的余量避免出现“刚过保就开始读不出来”的尴尬。5. 一次真实的固件烧录排障从“erase failed”到无法访问内存5.1 排障起点错误信息本身的含义做嵌入式开发的人很多都见过这类报错erase failed! cannot access memory internal command error flash download fail这串信息翻译过来是擦除失败无法访问内存内部命令错误Flash下载失败。它通常出现在烧录器、线刷工具或量产工装执行“全片擦除”阶段。很多工程师第一反应是“Flash坏了”但根据我过往的排障经验真正芯片损坏的比例不到一半。更多的原因是连接不可靠、参数不匹配、电源不稳、或用了错误的烧录配置。这类信息至少揭示了三件事主机已经通过BootROM或烧录器与芯片建立了基本通信否则不会走到“擦除”这一步。擦除命令发送后芯片没有在预期时间内返回成功状态。BootROM或工具认为当前状态异常终止了下载流程。所以排障第一步不是换芯片而是先弄清通信链路和命令时序哪里出了问题。5.2 逐级排查供电、时序、芯片识别、坏块状态我把整套排查顺序固定为下面几步每次都能快速缩小范围检查供电。用示波器看VCC和VCCQ的上电波形看有没有跌落、振铃、缓慢爬升。NAND对电压精度要求不算苛刻但上电顺序不能乱。如果供电来自LDO且负载电流突然拉高容易在上电瞬间出现低于最小工作电压的情况。读ID。进入BootROM模式尝试读取芯片ID。如果ID能读出来说明基本通信正常如果连ID都读不出重点查CE#、CLK、数据线的连接和电平。核对烧录工具里的型号参数。同一颗SLC NAND不同批次或不同封装版本可能有不同的页大小、块大小、时序参数。工具里如果选错型号常见的后果就是擦除命令发错芯片不响应。抓取时序波形。用逻辑分析仪或示波器抓CLE、ALE、WE#、RE#、R/B#。重点看命令锁存时CE#是否有效、地址建立时间是否满足要求、R/B#拉低后是否超时。这一步能验证是不是焊接虚焊、走线过长、上拉电阻缺失导致的信号抖动。隔离坏块。擦除失败不一定是全片问题有可能只是某个坏块。可以让工具跳过一个块或扫描坏块表看能否继续擦除其他区域。最后才考虑换芯片。如果以上都排查了仍然失败再换一颗已知好的样片验证判断是否有批量性问题。5.3 一次典型的根因片选信号上拉不足我在一块量产的板卡上遇到过间歇性烧录失败现象非常随机同一台工装烧十片偶有一片报错重新烧录又能通过。排查了很久最后用示波器盯住CE#引脚的波形才发现问题。主控的CE#引脚默认配置成高阻输入外部虽然画了一个10K上拉电阻但电阻位置离NAND芯片太远走线经过了两排过孔寄生电容偏大。烧录器驱动CE#时电平上升沿被拉得异常缓慢在某个温度或电压略低的批次上芯片在CE#还没有稳定到高电平时就收到了命令导致命令解析错误。把上拉电阻改到靠近NAND芯片的位置并把阻值从10K调成4.7K问题彻底消失。这个案例说明NAND参考电路里那些看起来“可有可无”的细节在高批量制造时会变成非常顽固的可靠性问题。5.4 顺带复盘一个盒子NAND版本烧录失败的案例有段时间经常看到有人问某款电视盒子的NAND版本线刷失败的问题。这个案例很有代表性。同一款型号的主板硬件版本可能有eMMC版和NAND版两种版本的BootROM引导方式完全不同。如果拿eMMC版本的烧录包去烧NAND版BootROM会在初始化NAND时发出错误的命令序列烧录工具往往就报“擦除失败、无法访问内存”。从现象看很像Flash坏了实际上只是软件包与硬件版本不匹配。这个案例对做量产的人是个提醒工厂烧录工装必须把“硬件版本识别”和“烧录包版本校验”做成强制步骤不能只靠产线工人肉眼判断。哪怕只是NAND和eMMC两种存储介质也要在软件层做识别和二次确认。这种错误如果进了市场售后成本会非常高。6. 高安全级SLC NAND选型与验证我的实测清单6.1 拿到样片后的八步实测序列评估一颗号称“高安全级”的SLC NAND不能只信Datasheet也不能只看官方Demo板必须按自己产品的使用方式做实测。我自己的评估序列是常温全片扫描擦除全片写全片0xA5回读校验统计坏块数和写读错误数。高温数据保持测试写入固定数据后放85℃烘箱在第72小时、168小时、500小时回读观察错误增长曲线。擦写寿命摸底挑选多个分区做P/E循环每1000次回读一次记录错误数随擦写次数的变化。掉电鲁棒性测试在擦除、编程、读回三个阶段随机掉电掉电前不关中断测试1000次以上检查是否出现分区表损坏或坏块扩散。读干扰测试长期反复读取一个块组检查相邻块是否出现错误。安全擦除验证执行真擦除后用工具检查是否还有残留数据。温变循环测试从-40℃到85℃快速往返同时进行读写操作确认低温下读写时序是否仍然符合要求。与SE协同测试验证SE与NAND之间的数据交换确认掉电不会破坏安全计数器和密钥状态。这套测试跑下来大概需要两三周但对于高安全产品这点时间非常值得。很多芯片的“低错误率”只在常温下成立一进环境箱就原形毕露。6.2 参数表上的耐久度与数据保持力怎么换算成工程余量Datasheet上写的“10万次P/E”“数据保持10年”看起来很漂亮但要注意这些参数大多是在指定条件下测得的实际工程使用必须做降额。举个例子。假设安全设备有一个32MB的日志分区每天写1MB数据SLC块大小128KB。那么每天擦除次数是1MB/128KB8次一年2920次10年就是29200次。10万次寿命的SLC有约3.4倍余量听起来很安全。但如果环境温度是85℃且日志写入不是均匀分布而是集中在某个时段实际磨损会不均匀。这时候10万次的寿命可能要打五折甚至三折。所以我一般要求日志分区的年擦写量控制在总寿命的1/10以内并用静态磨损均衡把写入分散到整个分区。还有一点很关键安全设备的日志系统不能无限增长否则Flash迟早被写满。必须有日志轮转策略或定时做安全擦除归档。这些都是产品级设计必须提前考虑的。6.3 三类高安全场景的选型侧重对比不同高安全场景对SLC NAND的需求侧重点不太一样我列一个实际选型时的对比场景核心需求选型侧重我踩过的坑金融终端/POS密钥安全、审计日志、防抵赖真擦除能力、OTP区域、计数器耐久日志区磨损过快导致设备用了两年就写满车规T-Box/EDR高低温、长生命周期、脱机数据保持数据保持力、温循可靠性、A/B升级高温老化后错误率上升必须提前留ECC余量工业PLC/RTU掉电保护、运行日志、固件升级安全掉电鲁棒性、坏块管理成熟度、写保护掉电瞬间分区表损坏卡死整台设备我在车规项目里尤其重视数据保持力。车辆会在夏季暴晒后出现70℃以上的舱内温度T-Box不上电时如果Flash数据保持力不够连续停放几周后启动校验就可能失败。这属于“平时看不出、关键时刻掉链子”的问题只能靠选型阶段的可靠性测试拦住。工业场景里PLC和RTU经常部署在变电站、配电柜等环境掉电是常态。NAND在擦除过程中掉电坏块风险会显著增加。所以控制器必须有掉电保护逻辑要么在擦除前先备份元数据要么采用两阶段提交的方式确保任何掉电瞬间系统都能回到一个可用的旧状态。SLC NAND因为擦除时间比TLC短掉电窗口也小这本身就是一种安全优势。结合我这些年踩过坑的经验高安全项目的存储选型最好遵循一条原则能用SLC就不碰TLC能用裸NAND加可控控制器就不用黑盒eMMC。SLC NAND也许不是成本最优解但它是可信度最优解。真正的高安全设备不是在最省钱的地方做聪明而是在最关键的地方做保守。
返回列表