【我所认知的BIOS】->反汇编BIOS之Bootblock(7)
-- Memory initial 之前的一些初始化DMA,8259
By Lightseed
5/20/2010
1、BIOS的主流程
为什么会有bootblock和非bootblock这么一说呢?其实就是因为有没有真正的内存可以用的区别。这个章节里我们一起来看看经过之前那些章节的讨论后,BIOS在初始化memory之前会做的一些动作。(稍微比较琐碎点,看起来比较枯燥。)
图1 BIOS主流程
2、确实是Normal后的第一个JMP
从下面的这段code中我们来研究一下,_F000:E1FC这里是的SP指向E200H地址,且我们看看在E200H这里这里存储的数据是E292H,注意了,这里可不是E202H哦。执行retn后,那么CPU的IP寄存器就变成了E292H了,那么CPU就会从此处取code来执行。(可不要犯了ROM_CALL的定势思维。)
_F000:E1F8 Not_Resume_From_Sx: ; CODE XREF: _F000:E1D3j
_F000:E1F8 ; _F000:E1EDj ...
_F000:E1F8 mov al, 0C0h ; '?
_F000:E1FA out 80h, al ; manufacture's diagnostic checkpoint
_F000:E1FC mov sp, 0E200h
_F000:E1FF retn
_F000:E1FF ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
_F000:E200 dw 0E292h
3、CPU Fast string的detect以及CMOS的初始化
_F000:E292 Go_on_bios:
。。。。。。。。。。。。。
_F000:E29D jmp Fast_string_If_open
_F000:E29D ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
_F000:E2A0 dw 0E2A2h
_F000:E2A2 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
_F000:E2A2 mov al, 8Bh ; '? ; CMOS REGISTER 0B: Default is all interrupts(AIE,PIE) turned off,
_F000:E2A2 ; date is in BCD format, time is in 24-hour mode, daylight savings
_F000:E2A2 ; time is disabled.
_F000:E2A4 mov ah, 2
Call Set_CMOS ;伪代码
_F000:E2AE mov al, 8Ah ; '? ; CMOS REGISTER 0A: Default is stage divider at 32.768 kHz, divider
_F000:E2AE ; output at 1.024 Khz, interrupting every 976.562 microseconds
_F000:E2B0 mov ah, 26h ; '&'
Call Set_CMOS ;伪代码
上面这段code主要做了两件事情,一个是检测CPU的fast string是否支持。另外一个是初始化CMOS的基本配置。
3.1 CPU的fast string
还是来看我们反汇编出来的code吧。
_F000:E6AB ;------------------------------------------------------------------------------------