【我所认知的BIOS】->反汇编BIOS之Bootblock(4)
--initialize Super IO
By Lightseed
5/13/2010
一、BIOS的主流程
到目前为止,我们已经看了两个重要的函数了,也是BIOS的必经之路。如下面的代码片段,BT_CPU_Init和Chipset_Reg_Init_Early我们都详细探讨过,那么随着流程下去,就是讨论SuperIO_INIT这个函数了。
到目前为止,我们的BIOS主流程如图1所示,
图1 BIOS主流程
那么今天就和大家详细来看看SuperIO_INIT这个函数都做了什么。BIOS究竟是怎么来初始化我们听的耳朵都起茧了的一个芯片——super IO。
二、SuperIO_INIT
废话就不多说了,让我们来看看code吧,这样一下子就明了了。
_F000:E274 mov ax, cs:[si]
_F000:E277 mov dx, 2Eh ; '.' ; Superio_Config_Port
_F000:E27A out dx, al
_F000:E27B out 0EBh, al
_F000:E27D xchg ah, al
_F000:E27F inc dx
_F000:E280 out dx, al ; out to SIO's configuration register
_F000:E281 add si, 2
_F000:E284 out 0EBh, al ; delay
_F000:E286 loop loc_FE274
这是SuperIO_INIT的主函数。不难发现其实中间的逻辑很简单,与之前初始化chipset的逻辑差不多,只是操作稍微有点点区别。对于上面这个函数,大部分看注释应该就能懂了,我只想单独说明一点。对于初学者而言,可能会问:
_F000:E268 mov al, 87h ; '?
_F000:E26A out dx, al
_F000:E26B nop
_F000:E26C nop
_F000:E26D out dx, al ; Enter SIO configurating mode
为什么上面要有两次的把87H送到DX的port上去。我的回答是,这是由super IO的芯片决定的。在super io的datasheet里面有说明,只有两次向super IO的固定端口写入entry key才能使得该super IO进入到配置模式,从而初始化它的寄存器。在datasheet的第九章有说明。在
http://blog.csdn.net/lightseed/archive/2009/09/02/4512464.aspx
这个章节里也有详细的论述。(再次提醒一下,blog里面的之前的那些文章都是基础,所以比较杂乱一点,但是在我们反汇编BIOS的阶段全部都会用上的。呵呵。。。如果您对反汇编