转:BIOS的恢复技术之Top Swap的原理应用
原文地址:https://baijiahao.baidu.com/s?id=1628248717252216590&wfr=spider&for=pc
一版又一版的BIOS推送,目的无外乎就是为了用户更好的体验。领略到BIOS更新重要性的(或者领情的或者有更新强迫症的)用户,会动手去更新BIOS。很多用户担心BIOS更新后的安全问题,尤其是不敢面对更新过程中被打断后带来的“灾难后果”。
![](https://pics6.baidu.com/feed/aa18972bd40735fab1e1db32fae788b70e240866.jpeg?token=429e18d0c599e416ff6b72c33184b7c4&s=38D1A14C53B1926806C8250F0200E0C2)
其实,你可以完全的将心放在肚子里,我们将全程为您的BIOS更新保驾护航,这就是今天科普的BIOS恢复技术。
BIOS恢复技术
BIOS恢复技术,就是当用户在更新BIOS的时候,出现了意外情况(比如断电)而导致的BIOS更新失败,下次开机的时候,BIOS还能正常启动的过程。
![](https://pics7.baidu.com/feed/cb8065380cd79123cbb182bfc982de86b0b780e6.jpeg?token=da325aef16c06c82dbf8caa506b0af24&s=677419C713AF8CEA067D901D0300C0C2)
常见的BIOS恢复技术以Top Swap /Dual BIOS为主。在这里,针对Top Swap做一详细介绍。
Top Swap
首先,Top Swap(TS)是桥(PCH)里面的一个Bit位,默认值为0。需要注意的是:这个bit值,是由主板上battery(纽扣电池)保存的。
![](https://pics0.baidu.com/feed/4ec2d5628535e5ddd873cea2127020ebcf1b62ae.jpeg?token=12fa81521f8cd4d9ff791df06e36e400&s=32A469A4D2AA9EEE6236E405030000C9)
其次,既然要说BIOS的恢复技术,就必须要提到Bios的内容存储结构。BIOS ROM就是若干个FV(Fireware Volume)组成的,每个FV都有自己的使命,而且对于一些特殊的FV,占有的空间大小甚至是固定的。
比如业内经常提到的NVRAM(NVRAM_BACKUP),在Rom Layout中就是一个FV,大小一般是128K;FV_BB,inel目前规定大小为1M。(如下具有Top Swap功能的Rom Layout部分组成FV,FV_BB_BACKUP为FV_BB的备份)
![](https://pics4.baidu.com/feed/29381f30e924b899cb7c834d0ab09a910b7bf6ba.jpeg?token=2b9d3c01df4f3700f08a10d9a53a5e3c&s=8803D714186848010E7CC5DF030090B9)
大家都知道,CPU开始拿的第一条指令,是位于0xFFFFFFF0的地方。FV_BB存放的是SEC和PEI阶段的Code,在0xFFFFFFF0的位置,拿的第一条指令永远都是SEC的Code。(下图:Rom Layout结构图)
![](https://pics5.baidu.com/feed/4bed2e738bd4b31c3453d52de360a07b9f2ff870.jpeg?token=adf68d87d8d9b6ce997018c9f1e606b3&s=4DA23D7299DF48C858D4B9CB000060B1)
从UEFI启动顺序就知道,SEC和PEI是UEFI开始的地方。所以FV_BB这块代码在开始的时候就决定着BIOS能不能运行下去。
Top Swap的目的,就是为了保证SEC和PEI阶段的数据完整性。简单的说就是,当电源上电的一刻起,CPU要能正确执行到BIOS里面的代码。
Top Swap原理以及应用
BIOS更新FV_BB过程
1. BIOS在更新之前,FV_BB和FV_BB_BACKUP区域的数据都是一样的。
2. BIOS在更新BIOS的时候,也是一块一块刷的,我们这里假设先刷的是FV_BB区域。
3. 当在开始刷FV_BB区域的时候,Top Swap bit位就会被写为1,等刷完FV_BB,Top Swap再被写为0。
那么,如果在刷的过程中,出现了异常情况(比如断电)导致FV_BB阶段未完成,下一次开机再从FV_BB启动,就会出现启动失败。这个时候,Top Swap作用就来了。因为更新FV_BB阶段未完成,所以Top Swap bit位的就是1。
下一次开机的时候,Cpu下地址0xFFFFFFF0给PCH,PCH会去检查Top Swap的值,如果是1,就不会从FV_BB开始启动,会将FV_BB的地址+1M(FV_BB的大小),从FV_BB_BACKUP位置启动,而FV_BB_BACKUP这块数据并未被破坏,启动自然没问题。(下附流程图)
![](https://pics3.baidu.com/feed/63d9f2d3572c11df1b3a009d0691e5d4f503c2e4.jpeg?token=dbba60f0576fab79f09181d7410c19c1&s=89635D32190B504D044C98C20000C0B2)
简单总结一下:
如果FV_BB未完成更新,下一次启动将会从FV_BB_BACKUP启动,并继续完成更新BIOS的大业;如果FV_BB完成更新,直至BIOS更新完成前,不管出什么意外,下一次启动都将从FV_BB启动,并继续后续相关动作。