14

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

 3 years ago
source link: https://zhuanlan.zhihu.com/p/137947510
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

中央处理器 (CPU)话题下的优秀回答者

现代的UEFI BIOS除了传统BIOS的一些配置信息还在CMOS中,绝大部分需要存储的内容都被保存在闪存芯片中,在那里,还居住着BIOS的执行代码、ME的代码和存储部分,以及一些其他固件们(GBe,PMC,TB PHY等等)。闪存,也就是Flash,这个词汇经常出现在我们周围,这不,长江存储又刷屏了[1]。但是,这种闪存是固态硬盘要用到的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芯片长这样(现在有些古老主板上还可以找到它):

ST FWH 2MB Flash

FWH闪存芯片管脚多,主板走线复杂,成本高,LPC总线速度慢,这些弊病让主板BIOS芯片在十几年前慢慢地向SPI NOR Flash芯片转移。现在的BIOS芯片几乎都是SPI芯片,如果你仔细寻找,你几乎可以在所有的台式机、笔记本、服务器、甚至是嵌入式系统中找到它的身影:

Winbound 25Q64BV

这是两个Winbond 8MB的芯片[2],左边是8个管脚的封装,一般用作笔记本和嵌入式系统上;右边是16 pin的封装,一般用作台式机和服务器中。

BIOS闪存芯片经历了一个逐渐变大的过程。从1MB到2MB,再到8MB,现在很多服务器已经用上了64MB的Flash。闪存内部要也不再仅仅是BIOS了,还有别的小伙伴杂居其中。如果你对闪存芯片内容好奇,可以用UEFITool[3]打开BIOS Image:

一个BIOS Image例子

可以看到,Flash开头是描述符Descriptor区域。里面的结构是Intel定义的,有其他各个区块的大小、位置和权限等信息,以及SoftStrap等等内容。BIOS的代码和存储只是其中一个区域,尽管在很多情况下是最大的区域。

BIOS区中的可变部分:Variable

BIOS区域中如何划分就是BIOS程序员自己做主了。一般被划分成很多区域(FV),一些是存储代码,一些是存储数据。存储数据是利用了NOR Flash的非易失(NVM)特性,简单来说就是掉电内容不丢失,这样用户的一些选项(setup options)才能长期存储。尽管用在固态硬盘的NAND Flash和BIOS芯片NOR Flash在存储原理上有很大不同,但一点却是相似的,那就是数据可以从1变成0,但不能从0变成1:

想要从0变1,要经历一个擦除操作,这就是闪存所以被称为Flash的原因。而闪存的寿命是由能够擦除多少次来决定的,在NAND Flash是这样,在NOR Flash上也没有不同:

NOR Flash可擦除次数更少

在所有影响寿命的地方,我们一定要精打细算,BIOS 芯片也不能例外,谁也不想用着用着,主板忽然损坏了吧。这就要求BIOS在存储数据的时候,不能采取原地擦除的策略,而只是标记一下无效,在后期一次性擦除,延长Flash寿命。在NAND Flash里面这个过程叫做GC(Garbage Collection),而在BIOS NOR上我们叫做Reclaim:

从图中,我们看到会有内容搬来搬去和整理的动作,比较两者,就会发现,有效数据一个个拍好了,十分整洁,为下一次的数据加入做好了充分的准备。这个搬迁的过程,不可避免的会将数据搬到内存,再从内存中移到目标块,同学们有没有想过,在搬的过程中,如果出现断电,是不是主板就变砖了?这就是图中有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),它的擦除次数是:

用它的最小擦除次数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秒,一天可以重启:

24 x 60 x 60 / 10 = 1.44万次

而按照最小擦除次数10万次计算,能用:

10/1.44= 7.14天!

怪不得慢慢地一个个都坏了呢!后来去掉了时间戳,才解决问题。

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。

用微信扫描二维码加入UEFIBlog公众号

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK