人物和情节完全虚构,纯属加戏,请勿对号入座。前传在这里:
单位的小张自从上次深入学习了内存条的知识后,对计算机兴趣大增,从此没事就摆弄电脑的各种配件,慢慢地小有名气起来,人称计算机“小能手”。小伙的“研究”越来越深入,拼拼凑凑已经不能满足他装那个啥的需求了。这一天突发奇想,想DIY一个高级BIOS:“如果我的BIOS能够直接支持NTFS分区,那不是可以省掉UEFI分区了吗?一定大受欢迎!”想着,脸上不禁放出光来,开始脑补推出高级BIOS,挣一大笔钱,从此迎娶白富美,走上人生巅峰的画面。小张咽了咽口水,说干就干,立刻把桌子上的电脑大卸八块。但看到躺倒在桌子上无辜的主板,不禁拔剑四顾心茫然,从哪里开始呢?
不出意外,小张又来找我了。看到他崇拜的目光和恭维的话语,刚到嘴边的"都折现吧"被我吞了回去。好吧,老规矩,请喝一杯咖啡,带你装那个啥带你飞!半杯咖啡下肚,我虽然对他在数个TB的硬盘中节省一百来MB的主意不以为然,但还是为他出谋划策起来。这件事完全可行,不需要BIOS的源代码。为达到目标,我们需要分成三个步骤:
1.理论准备:知道BIOS文件的构成。
2.工具准备:如何读取主板BIOS映像文件和烧录回去修改过的BIOS文件。
3.动手实操:利用工具在BIOS中注入NTFS驱动。
今天时间有限,我们先从第一步开始讲起。
BIOS文件发展历史我们从应用最广泛的Intel系主板来讲。回到The good old days,那还是2005年,BIOS文件里面就是BIOS,我们的小甜甜南桥还是ICH7。多么纯粹,多么自然!可惜好日子在ICH8后改变了,为了加入ME的支持,引入了一个叫做Descriptor mode的东西,从此SPI Flash里面不再只有BIOS文件,而变成了一个这样的结构 :
来源参考资料1
BIOS烧片文件里面挤进来ME Image、南桥网卡的驱动和一些平台数据,叫做BIOS文件就比较勉强了。在经过一段时间的混乱后,Intel平台的BIOS文件开始统一叫做IFWI。这个官方名字让不少同学感到困惑,IFWI第一个I难道是Intel的缩写吗?非也,IFWI是(Integrated Firmware Image)的缩写,毕竟这个Image里面不仅仅是BIOS一个固件,包括了很多各种固件,所以叫做集成固件映像文件更加准确。IFWI文件里面最初只有ME和网络驱动,后面随着南桥里面的固件越来越多,现在内容也慢慢丰富起来,包括了ISH、TB FW、TB PHY等等内容。
BIOS编译的时候,是先编译出符合UEFI标准的BIOS文件FD,再通过一个叫做Stitch的过程,将IFWI里面的各个模块“缝合”在一起。这其中,最重要的一步就是调用一个叫做FIT的工具,将神秘的Descriptor部分填写好。那么这个”描述表“里面有些什么东西呢?
Descriptor的内容后期IFWI在还引入了一个表,固定在(4GB - 40h)这个地址,叫做FIT table 的结构,用来指向BIOS签名等等信息,它的Spec大家可以自行学习。
Descriptor,故名思意,里面是一个描述表。现在有不少公开文档介绍里面的详细内容,如ApolloLake 的文档:
总的来说是一堆指针,指向IFWI中各个固件。他们的内容可以参考参考资料1,这里面比较有意思的是这个叫做SoftStrap的节。什么叫做SoftStrap呢?它对应以前的Hard Strap,也就是主板硬件连线的Strap,从前作死在主板上的Strap,现在可以通过软件配了,所以叫做Soft。里面有很多有趣的内容,包括南桥HSIO的分配就是从这个表里面得到信息:
尾声一杯咖啡的时间很快就到了,看着小张求知的表情,我知道,下一杯免费咖啡有指望了。我拍拍屁股,不带走一张账单,留下小张陷入深深的思考中。