【我所认知的BIOS】->反汇编BIOS之Bootblock(9)
-- Memory initial 函数
By Lightseed
06/24/2010
1、BIOS的主流程
为什么会有bootblock和非bootblock这么一说呢?其实就是因为有没有真正的内存可以用的区别。这个章节里我们一起来看看经过之前那些章节的讨论后,BIOS在初始化memory之前会做的一些动作。(稍微比较琐碎点,看起来比较枯燥。)Memory initial这个函数里面,会再做一些前期的准备工作。比如8259的中断控制器的初始化,PCIE的初始化,等等然后进入到intel提供的MRC里面去。那么这节就讲讲这个函数里面具体接触的东西。
图1 BIOS主流程
2、CT_Memory_Init整个函数的架构
_F000:36E0 CT_Memory_Init: ; CODE XREF: _F000:E377j
Call Power_Managment_init;伪代码
_F000:370C Power_Managment_init_Exit: ; CODE XREF: _F000:8850j
Call PCIExpressInit ;伪代码
Call Memory_INIT ; There are too many registers which intel do not release, so I have not plan to comment it.
; We usually call these code "MRC", it means memory refrence code. As I know, Award and AMI
; MRC are the same.
;中间省略N行
Call IGDDetect ; 伪代码
Ret
上面是memory initial的整个函数反汇编出来的代码。架构也很清晰,正如之前说的那些,8259初始化好了后,继续Power management的初始化,然后再是PCIE的初始化,然后是真正进入到intel的MRC去detect和初始化内存。一条线,比较简单。
3、关于南桥那面Power management的初始化
从_F000:3709这行中可以看出,在8259初始化好了以后,程序就会进入到初始化power management的函数里去。那我们来看看这个函数里面具体都做了什么。
_F000:8834 Power_Managment_init: ; CODE XREF: _F000:3709j