【我所认知的BIOS】->反汇编BIOS之Bootblock(5)

【我所认知的BIOS->反汇编BIOSBootblock(5)

--Store CPU type to CMOS

By Lightseed

5/18/2010

一、BIOS的主流程

从这章开始,我在每章的开头说把目前BIOS的主流程进行到了哪一步放在最前面,这样有助于理解整个Award BIOS的流程。

到目前为止,我们的BIOS主流程如图1所示,

1 BIOS主流程

那这节我们就来看看BIOS中记录CPU type的子函数。

二、Record_CPU_type_cmos

废话还是要说一下,从下面的code中我们可以看到,在Record_CPU_type_cmos这个函数前面有其他的东西,我们先暂时不管,直接看这个函数的一些片段(因为那是下下个章节要说的。)。

_F000:E580 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?

_F000:E580

_F000:E580 Record_CPU_type_cmos:          ; CODE XREF:   _F000:E1DAj

_F000:E580       mov    es, sp

_F000:E582       assume es:nothing

_F000:E582       xchg       si, dx

_F000:E584       mov    sp, 0E58Ah

_F000:E587       jmp    locret_FF76A

_F000:E59A

_F000:E59A Wait_RTC_ready:            ; CODE XREF:   _F000:E5B0j

 

_F000:E5D3       xchg       dx, bp

_F000:E5D5       mov    si, 0E57Ah    ; From the table, we  can know there is no thing infomation in the CPU_TYPE_TABLE

_F000:E5D8

_F000:E5D8 loc_FE5D8:                 ; CODE XREF:   _F000:E5EAj

_F000:E5D8       mov    ax, cs:[si]

_F000:E5DB       cmp    dx, cs:[si+2]

_F000:E5DF       jb     loc_FE5E7

_F000:E5E1       cmp    dx, cs:[si+4]

_F000:E5E5       jbe    loc_FE5EC

_F000:E5E7

_F000:E5E7 loc_FE5E7:                 ; CODE XREF:   _F000:E5DFj

_F000:E5E7       add    si, 6

_F000:E5EA       jmp    short loc_FE5D8

_F000:E5EC ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?

 

                  Call   Store_cpu_type_CMOS  ;伪代码

 

_F000:E604 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?

_F000:E604       mov    sp, es     ; Return CPU_detect

_F000:E606       retn

上面是Record_CPU_type_cmos的主函数,因为code感觉稍微比较乱一点,我还是要简单说明一下他的结构。

_F000:E582_F000:E58C    _F000:E58E这三行都是为了保存DX寄存器做的动作。

Wait_RTC_ready这个loop主要是为了测试CMOS是否是OK的。否则就会在这里死机。

_F000:E5D3这行是恢复了CPU 上电时存在GS里面的CPU的信息,后续的动作是用这个DX的值来在_F000:E57A CPU_type_table这个table中确定当前CPUtype的。

④经过上面的三步后,再通过调用相关操作CMOS的函数把对应的值存到CMOS里面去。

⑤从

_F000:E579 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?

_F000:E57A CPU_type_table  db  86h ; ?

_F000:E57B       db  0 ; 

_F000:E57C       db  0 ; 

_F000:E57D       db  0 ; 

_F000:E57E       db 0FFh ; 

_F000:E57F       db 0FFh ;

这个table里面可以看到,其实实际的是没信息的。那么在函数执行的时候,参考这个table的时候发现是没有对应的CPU类型的,那么就会记录这个CPU 类型是未知的。姑且我们现在不去追究后续有什么用,BIOS在留下了足迹到CMOS里。

三、小结

这个函数没有什么特色的地方,操作也比较简单,没说太多。函数的作用在文章的前面就说了。

阅读更多
换一批

没有更多推荐了,返回首页