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


为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
现代的UEFI BIOS除了传统BIOS的一些配置信息还在CMOS中 , 绝大部分需要存储的内容都被保存在闪存芯片中 , 在那里 , 还居住着BIOS的执行代码、ME的代码和存储部分 , 以及一些其他固件们(GBe , PMC , TB PHY等等) 。 闪存 , 也就是Flash , 这个词汇经常出现在我们周围 , 这不 , 长江存储又刷屏了。 但是 , 这种闪存是固态硬盘要用到的NAND Flash , 而不是BIOS存储用到的NOR Flash 。
BIOS之所以选用NOR , 是看中了它的XIP , 也就是eXecute in place特性 。 我粗陋的翻译为原地执行代码 , 而不需要加载Load到某块内存中执行 。 这个特性十分重要 , 因为在上电启动后 , 内存初始化还没有进行 , 没有内存可供使用 , 虽然我们可以将Cache偷过来做内存用一段时间(Cache As RAM , CAR) , 但总是没有直接用起来方便 。 在CAR好了之前的代码 , 都是在NOR Flash上直接执行的(XIP) 。
BIOS芯片尽管BIOS使用NOR Flash上已经有很长时间 , 但它和南桥芯片的接口在经历了从FWH到SPI的转变 。 十几年前闪存接口是传统的挂在LPC下面的FirmwareHub , 那时的BIOS芯片长这样(现在有些古老主板上还可以找到它):
为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
ST FWH 2MB Flash
FWH闪存芯片管脚多 , 主板走线复杂 , 成本高 , LPC总线速度慢 , 这些弊病让主板BIOS芯片在十几年前慢慢地向SPI NOR Flash芯片转移 。 现在的BIOS芯片几乎都是SPI芯片 , 如果你仔细寻找 , 你几乎可以在所有的台式机、笔记本、服务器、甚至是嵌入式系统中找到它的身影:
为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
Winbound 25Q64BV
这是两个Winbond 8MB的芯片, 左边是8个管脚的封装 , 一般用作笔记本和嵌入式系统上;右边是16 pin的封装 , 一般用作台式机和服务器中 。
BIOS闪存芯片经历了一个逐渐变大的过程 。 从1MB到2MB , 再到8MB , 现在很多服务器已经用上了64MB的Flash 。 闪存内部要也不再仅仅是BIOS了 , 还有别的小伙伴杂居其中 。 如果你对闪存芯片内容好奇 , 可以用UEFITool 打开BIOS Image:
为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
一个BIOS Image例子
可以看到 , Flash开头是描述符Descriptor区域 。 里面的结构是Intel定义的 , 有其他各个区块的大小、位置和权限等信息 , 以及SoftStrap等等内容 。 BIOS的代码和存储只是其中一个区域 , 尽管在很多情况下是最大的区域 。
BIOS区中的可变部分:VariableBIOS区域中如何划分就是BIOS程序员自己做主了 。 一般被划分成很多区域(FV) , 一些是存储代码 , 一些是存储数据 。 存储数据是利用了NOR Flash的非易失(NVM)特性 , 简单来说就是掉电内容不丢失 , 这样用户的一些选项(setup options)才能长期存储 。 尽管用在固态硬盘的NAND Flash和BIOS芯片NOR Flash在存储原理上有很大不同 , 但一点却是相似的 , 那就是数据可以从1变成0 , 但不能从0变成1:
为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
想要从0变1 , 要经历一个擦除操作 , 这就是闪存所以被称为Flash的原因 。 而闪存的寿命是由能够擦除多少次来决定的 , 在NAND Flash是这样 , 在NOR Flash上也没有不同:
为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
NOR Flash可擦除次数更少
在所有影响寿命的地方 , 我们一定要精打细算 , BIOS 芯片也不能例外 , 谁也不想用着用着 , 主板忽然损坏了吧 。 这就要求BIOS在存储数据的时候 , 不能采取原地擦除的策略 , 而只是标记一下无效 , 在后期一次性擦除 , 延长Flash寿命 。 在NAND Flash里面这个过程叫做GC(Garbage Collection) , 而在BIOS NOR上我们叫做Reclaim:
为什么很多用了几十年的主板也没听说过BIOS的数据坏了的呢?文章插图
从图中 , 我们看到会有内容搬来搬去和整理的动作 , 比较两者 , 就会发现 , 有效数据一个个拍好了 , 十分整洁 , 为下一次的数据加入做好了充分的准备 。 这个搬迁的过程 , 不可避免的会将数据搬到内存 , 再从内存中移到目标块 , 同学们有没有想过 , 在搬的过程中 , 如果出现断电 , 是不是主板就变砖了?这就是图中有Spare Block的原因 , 它起到缓存 , 在搬得过程中 , 保证数据永远是可用的 。 它加上其他一些安全特性 , 就组成了UEFI BIOS存储的基线:高容错(Fault Tolerant)非易失存储系统 -- UEFI Variable 。 我们在BIOS界面上可见和不可见的改动 , 都存储在variable中 。