【我所认知的BIOS】->反汇编BIOS之Bootblock(11)
-- 初识BIOS的解压缩
By Lightseed
8/24/2010
最近一段时间心态不太好,所以blog也没有更新。现在总算是调整过来了,目前我是这么打算,反汇编的文章暂时就写到bootblock这里了。至于如果还有兴趣研究POST部分的爱好者的话,我们可以私聊。后续文章准备写些比较深入点的文章,比较细节点的分析等等。希望大家给点建议,也希望我们BIOS ren共同进步~并且我准备把这个blog搬到BIOS联盟上去。毕竟那面比较专业一点。至此这篇文章也是bootblock反汇编的最后一篇文章了,其中还有一个问题没研究就是award bios的解压缩函数。这个函数用的LHA的压缩和解压缩算法,我没深入研究过。不过据说网上研究过的人比比皆是,再加上这段code一般都不会出错,所以我暂时也不打算深入研究了。如果你已经研究过了,可否和我share一下?
1、BIOS的主流程
在bootblock的最后阶段,那当然就是把BIOS的压缩代码全部解压缩出来,然后进入到后续的BIOS初始化流程当中去。在这个章节中,我们就来简单探讨一下解压缩和解压缩以后BIOS的大致走向。(关于解压缩的细节,我们再议。)
图1 BIOS主流程
2、在解压缩BIOS之前的一些初始化
BIOS执行到现在,它本身已经被copy到了RAM中来,并且也正常RAM中跑了。不过为了能够让后续的BIOS跑的更快,更稳的话,我们还需要把内存的一些属性给初始化一下。这里要第一次接触到MTRR的初始化了哦。在前面的基础章节我曾经有和大家探讨过内存的属性的初始化。
http://blog.youkuaiyun.com/lightseed/archive/2009/09/28/4603383.aspx
如果您忘记的MTRR的一些东西,那么您可以从这里再回味一下。
_F000:E482 jmp far ptr 2000h:0E487h ; Here BIOS copy itself to RAM
_F000:E482 ; Althrough BIOS will use FAR JMP to run at 2000:0, but code is continuous.
_F000:E482 ; So we can go on disassembling in F0000
_F000:E487 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
_F000:E487 xor ax, ax
_F000:E489 mov ss, ax
_F000:E48B assume ss:seg000
_F000:E48B mov sp, 0E00h ; Stack init
_F000:E48E call Check_If_Intel_CPU
_F000:E491 jz Yes_its_IntelCPU
_F000:E493 cmp ebx, 'tneC' ; yuanhu+ ;Centaur CPU's identifier
_F000:E49A jnz loc_FE4DB
_F000:E49C
_F000:E49C Yes_its_IntelCPU: ; CODE XREF: _F000:E491j
_F000:E49C mov eax, 6060606h
_F000:E4A2 mov edx, eax
_F000:E4A5 mov ecx, 250h ; MTTR Address(250H) for 0-512K is WB
_F000:E4AB wrmsr ; Init memory type range register(MTTR)
_F000:E4