为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?( 二 )


在所有影响寿命的地方 , 我们一定要精打细算 , BIOS 芯片也不能例外 , 谁也不想用着用着 , 主板忽然损坏了吧 。 这就要求BIOS在存储数据的时候 , 不能采取原地擦除的策略 , 而只是标记一下无效 , 在后期一次性擦除 , 延长Flash寿命 。 在NAND Flash里面这个过程叫做GC(Garbage Collection) , 而在BIOS NOR上我们叫做Reclaim:
为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
从图中 , 我们看到会有内容搬来搬去和整理的动作 , 比较两者 , 就会发现 , 有效数据一个个拍好了 , 十分整洁 , 为下一次的数据加入做好了充分的准备 。 这个搬迁的过程 , 不可避免的会将数据搬到内存 , 再从内存中移到目标块 , 同学们有没有想过 , 在搬的过程中 , 如果出现断电 , 是不是主板就变砖了?这就是图中有Spare Block的原因 , 它起到缓存 , 在搬得过程中 , 保证数据永远是可用的 。 它加上其他一些安全特性 , 就组成了UEFI BIOS存储的基线:高容错(Fault Tolerant)非易失存储系统 -- UEFI Variable 。 我们在BIOS界面上可见和不可见的改动 , 都存储在variable中 。
红旗能打多久?说了这么多原理 , 现在我们可以回答很多人关心的一个问题:如果我经常修改BIOS设置 , 会不会把BIOS写坏了?
我们已知条件有哪些呢?
1.UEFI BIOS在设计的时候 , 已经采用算法规避大量的擦除操作 , 将擦除操作归并 , 以增加闪存芯片寿命 。
2. 不是每次BIOS启动 , 都有数据需要保存的 , 大多数情况下启动过程中没有写闪存操作 。
那么如果你是个电脑爱好者 , 又十分勤奋 , 每天重新启动10次电脑 , 每次都更改BIOS配置 , 多久电脑会损坏?我们现在就这种脑洞情况进行一个有趣的计算 。
假设你的电脑中BIOS UEFI Variable空间是64KB(台式机一般情况 , 服务器会大些) , 有一半的内容被固定配置占据 , 也就是还剩下32KB给BIOS开机设置项:Setup Variable用 。 不巧的是 , 主板的BIOS配置又很多 , 多达要用4KB来保存(极端情况)!这样每次开机会产生4KB的无效数据块 , 32 / 4 = 8次开机就要Reclaim一次 , 也就是要擦除一次 。 主板BIOS闪存芯片是上例中的W25Q64BV 。 在芯片手册中(参考资料2) , 它的擦除次数是:
为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
用它的最小擦除次数10万计算 , 能用多久呢?很简单的算式:
100000 /(10 / 8)= 80000天 = 219年!那如果你对BIOS设置有着疯狂的爱好 , 每天重启100次 , 而每次又都修改BIOS设置呢?理论上 , 也能用上近22年!
结论UEFI BIOS已经做了很多优化 , 作为普通用户 , 大家完全没有必要担心Flash写坏 。 但也不是完全高枕无忧 , BIOS业内人士还是要注意防止BIOS写坏的情况发生 。 我曾经做过一个项目 , 后期要求做压力测试 , 机器要在各种情况下(Shell , Windows , Linux)各要重启4000次 。 我拨了一些板子做这项压力测试 , 这些板子基本在不停的重启中(自动测试驱动) 。 过了一段时间测试部门报告一个板子坏了 , 烧不了BIOS了 。 我开始还不以为意 , 渐渐的 , 越来越多的压力测试主板都不能烧片了 , 这才引起我的注意 , 一计算才发现 , 好家伙 , 是程序的问题 , 险些引发大规模召回事件 。 原来为了快速启动 , 内存初始化会保存内存training的参数 , 下次重启就不需要再Training了 , 节省了很多时间 。 而这些参数很大 , 占据了48KB空间(Variable只有64KB) 。 好死不死 , 尽管程序增加了逻辑 , 内容一样 , 就不会重复存了 , 但程序员在参数里面加入了时间戳 , 结果checksum每次不一样 , 这样每次重启都要存 , 每存一次都要Reclaim 。 每次重启需要10秒 , 一天可以重启: