主板升级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芯片长这样(现在有些古老主板上还可以找到它):
ST FWH 2MB Flash
FWH闪存芯片管脚多,主板走线复杂,成本高,LPC总线速度慢,这些弊病让主板BIOS芯片在十几年前慢慢地向SPI NOR Flash芯片转移。现在的BIOS芯片几乎都是SPI芯片,如果你仔细寻找,你几乎可以在所有的台式机、笔记本、服务器、甚至是嵌入式系统中找到它的身影:
Winbound 25Q64BV
这是两个Winbond 8MB的芯片 ,左边是8个管脚的封装,一般用作笔记本和嵌入式系统上;右边是16 pin的封装,一般用作台式机和服务器中。
BIOS闪存芯片经历了一个逐渐变大的过程。从1MB到2MB,再到8MB,现在很多服务器已经用上了64MB的Flash。闪存内部要也不再仅仅是BIOS了,还有别的小伙伴杂居其中。如果你对闪存芯片内容好奇,可以用UEFITool 打开BIOS Image:
一个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:
想要从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天!
怪不得慢慢地一个个都坏了呢!后来去掉了时间戳,才解决问题。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com