您的位置:首页 > 移动开发 > IOS开发

【我所認知的BIOS】—>Decompression补充

2009-06-05 09:01 375 查看

【我所認知的BIOS】—>Decompression补充

By LightSeed
2009-6-4
这篇文章主要是对上一篇文章Decompression的补充,上一篇文章一是考虑到篇幅,二是考虑到还没有谈到反汇编BIOS二进制文件,所以没有讲的很详细。在这篇文章中举个BIOS的例子来详细说明AWxxx  code在运行过程中解压缩的过程。(筆者:不管是解壓還是PCI的資源分配我們在掌握的時候都要首先掌握其框架,這個才是最重要的。在掌握了框架的基礎上再去跟code才會有事半功倍的效果。而且這樣也能夠讓你的知識更加體系化。)這補充的文章著重從解壓的結構上講,沒有講很細節的東西。

1、BIOS中模块存在形式

在BIOS的二进制文件中我们可以用查看二进制文件的编辑器可以看到,各个模块存在的形式。上一章我们有详细讲LZH文件的格式,它们有固定的header和固定的模块结尾。(陌生的话建议先看看LZH压缩格式的说明见【我所認知的BIOS】—>Decompression)那么让我们来看看BIOS bin文件中的模块样子吧。如图1
 



图1 BIOS bin中模块的存在形式
从图1中我们可以清楚地看到各个模块在BIOS bin文件中都是以LZH格式存在的。
我们知道了BIOS bin文件中的模块是被LHA压缩的,那么在解压缩的时候也就知道怎么解压缩了,算法我到是没有研究过。现在我们最关注的不是怎么解压缩(因为那些都是有成熟的算法去做的),而是解压缩后模块的数据是放到了内存中的哪里?

2、解压缩后存放在哪里?

详细参看一下图1中画红线的地方,他们的offset对应的是LZH格式中的11H~12H。这个word是解压出来的数据将要被存放的segment。(当然图1中我截取了三个模块,其他的所有模块都是这样的。)
那么我们提取出来看看,见表2.1
表2.1
模块名字
Segment
a.bin(system BIOS)
5000
Awardext.rom
407F
ACPITBL.BIN
4003
其他模块也是一样。上表是我们读出来的数据,可能大家都会问为什么不是4000H呢?这个我以后在讲反汇编的时候再给大家解释,它是有其他作用的。Kernel在解压的过程中会先把40XX中的低byte清零,这个时候407F,4003等等都成了4000H,这才是要真正解压缩数据要存放的地方。
(提醒一下:当我们在用cbrom压PCI option rom模块的时候,用cbrom /pci和cbrom /4086是同样的效果,那么你能猜出其中的联系么?)

3、BIOS中的模块都是一次解压缩的吗?

NO!要一次解压缩是不太可能的,哪儿有那么的空间来给我们用哦。就算是有,代码执行的效率也不高。因为每个模块的格式都是一样,那么每次需要那个模块我们就解哪个模块出来就可以了。而且都是放在了4000:0处,(system bios模块除外)程序再到这里取出来即可用。简单点说如下图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息