【我所认知的BIOS】->反汇编BIOS之Bootblock(3)
--initialize some chipset register
By Lightseed
5/13/2010
在上一篇中,我和大家探讨了下面代码中的BT_CPU_Init这个函数,它主要是一些特殊CPU的micro code的update。那么我们继续往下走,就会发现初始化chipset寄存器的函数,如_F000:E1C3这行所示。这里是用ROM_CALL来调用的。
_F000:E1B8 mov sp, 0E1BEh ; First Use ROM_CALL
_F000:E1BB jmp BT_CPU_Init ; Save esp (Return Address)
_F000:E1BB ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
_F000:E1BE dw 0E1C0h
_F000:E1C0 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
Call Chipset_Reg_Init_Early ;伪代码
Chipset_Reg_Init_Early函数的代码要反汇编也很容易啦,双击或者是点中它回车即可。反汇编并加注如下:
; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
_F000:F600
_F000:F600 Chipset_Reg_Init_Early: ; CODE XREF: _F000:E1C3j
_F000:F604 mov si, 0F6DCh ; Get the chipset register initial table offset
_F000:F607
_F000:F607 Init_Chipset_Ren_loop: ; CODE XREF: _F000:F629j
_F000:F607 mov cx, cs:[si] ; Get the DEV#,FUNC#,REG#
Call Get_Pci_Byte ; ROM_CALL to get byte from chipset.伪代码,取回值存在AL里
_F000:F612 and al, cs:[si+2]
_F000:F616 or al, cs:[si+3]
Call Set_Pci_byte ;伪代码
_F000:F622 add si, 4
_F000:F625 cmp si, 0F740h ; Is init table end?
_F000:F629 jnz Init_Chipset_Ren_loop ; No, go on looping
上面这个函数其实注释已经把90%的内容都说清楚了,不过我还是要再强调一下其中的一点,在_F000:F604中,是为了找到一个table。在这个table中存放着一系列的寄存器的地址以及BIOS需要initialize的值。我详细加注如下:
Chipset_Reg_Init_table dw 0F01Ch ; Bus 0# Dev 30#, Func 0#, Reg 1CH .PCI to PCI bridge register 1ch
_F000:F6DE db 0 ; ; Clear all bit
_F000:F6DF db 10h ; ; Set the IO base is 10h, it means base address is 1000h
_F000:F6DF