`
insertyou
  • 浏览: 889523 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

-- Memory initial 函数

By Lightseed

06/24/2010

1BIOS的主流程

为什么会有bootblock和非bootblock这么一说呢?其实就是因为有没有真正的内存可以用的区别。这个章节里我们一起来看看经过之前那些章节的讨论后,BIOS在初始化memory之前会做的一些动作。(稍微比较琐碎点,看起来比较枯燥。)Memory initial这个函数里面,会再做一些前期的准备工作。比如8259的中断控制器的初始化,PCIE的初始化,等等然后进入到intel提供的MRC里面去。那么这节就讲讲这个函数里面具体接触的东西。

1 BIOS主流程

2CT_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的初始化,然后是真正进入到intelMRCdetect和初始化内存。一条线,比较简单。

3、关于南桥那面Power management的初始化

_F000:3709这行中可以看出,在8259初始化好了以后,程序就会进入到初始化power management的函数里去。那我们来看看这个函数里面具体都做了什么。

_F000:8834 Power_Managment_init: ; CODE XREF: _F000:3709j

_F000:8834 mov si, 880Ch

_F000:8837 mov dh, 40h ; '@' ; PM IO

_F000:8839

_F000:8839 Power_Managment_init_loop: ; CODE XREF: _F000:884Ej

_F000:8839 mov dl, cs:[si] ; offset

_F000:883C mov al, cs:[si+1] ; get the value to store

_F000:8840 out dx, al ; set

_F000:8841 out 0EBh, al

_F000:8843 out 0EBh, al

_F000:8845 out 0EBh, al

_F000:8847 add si, 2

_F000:884A cmp si, 8834h ; Table end?

_F000:884E jnz Power_Managment_init_loop

看到上面的函数是不是大家都有比较熟悉的感觉呀?一开始进来就是给SI找到一个tableoffset,然后就是按照结构体的元素来初始化各个寄存器。而这个结构体就比较简单了,总共两个byte。第一个byte是在Power management base address(还记得么?在前面的文章里有讲,PM IO base address4000H)上的偏移。关于table里面的东西,我就不多收了,我觉得我写的挺详细的,只要你对照ICHdatasheet一切都能查到对应的描述。

_F000:880C ;[]--------------------------------------------[]

_F000:880C This table is very easy, so I will not comment them one by one.

_F000:880C I choose the important register to comment. :)

_F000:880C ;[]--------------------------------------------[]

_F000:880C Power_Managment_init_table db 2 ; ; Power Management 1 Enable Register Low byte

_F000:880D db 0 ; ;

_F000:880D ;

_F000:880E db 3 ; ; Power Management 1 Enable Register High byte

_F000:880F db 0 ; ;

_F000:880F ;

_F000:8810 db 0 ; ; Power Management 1 Status Register low byte

_F000:8811 db 0FFh ; ; clear all status

_F000:8811 ;

_F000:8812 db 1 ;

_F000:8813 db 0FFh ; ; Power Management 1 Status Register high byte

_F000:8813 ;

_F000:8814 db 11h ; ; Processor Control Register

_F000:8815 db 0 ; ; No forced throttling, No clock throttling is occurring (maximum processor performance).

_F000:8815 ;

_F000:8816 db 28h ; ( ; General Purpose Event 0 Status Register low byte

_F000:8817 db 0FFh ; ;

_F000:8817 ;

_F000:8818 db 29h ; ) ; General Purpose Event 0 Status Register high byte

_F000:8819 db 0FFh ; ;

_F000:8819 ;

_F000:881A db 2Ah ; *

_F000:881B db 0FFh ; ;

_F000:881B ;

_F000:881C db 2Bh ; +

_F000:881D db 0FFh ; ; clear all GPE0 status

_F000:881D ;

_F000:881E db 2Ch ; , ; General Purpose Event 0 Enables Register the 1st byte

_F000:881F db 0 ; ;

_F000:881F ;

_F000:8820 db 2Dh ; -

_F000:8821 db 0 ; ;

_F000:8821 ;

_F000:8822 db 2Eh ; .

_F000:8823 db 0 ; ;

_F000:8823 ;

_F000:8824 db 2Fh ; /

_F000:8825 db 0 ; ; all GPE0 disable

_F000:8825 ;

_F000:8826 db 30h ; 0 ; SMI Control and Enable Register 1st byte

_F000:8827 db 20h ; ; Enables writes to the APM_CNT register to cause an SMI#.

_F000:8827 ;

_F000:8828 db 31h ; 1

_F000:8829 db 0 ; ; Other function disable

_F000:8829 ;

_F000:882A db 34h ; 4 ; SMI Status Register 1st byte

_F000:882B db 0FFh ; ;

_F000:882B ;

_F000:882C db 35h ; 5 ; SMI Status Register 2nd byte

_F000:882D db 0FFh ; ; clear all SMI status

_F000:882D ;

_F000:882E db 41h ; A ; I can not find the remark of this register in datasheet...:(

_F000:882F db 30h ; 0 ;

_F000:882F ;

_F000:8830 db 44h ; D ; Device Activity Status Register low byte

_F000:8831 db 0FFh ; ;

_F000:8831 ;

_F000:8832 db 45h ; E ; Device Activity Status Register high byte

_F000:8833 db 0FFh ; ; clear all status

4PCIE的初始化

关于这部分的说明,我觉得很惭愧,据我所了解,这部分的代码绝对多数是为了解决一些bug才放在这里的。而且这些bug应该还都是北桥那面的一些东西,intel也没公布相关的说明,所以我也不知道究竟这里面的寄存器是有啥用。这下这段代码就是PCIE初始化的函数被反汇编出来的源码。不过我把这个函数的地址贴出来,而且这里的基本上BIOS是不会动的,所以平时我也没有深入进去研究。

_F000:394A ;[]----------------------------------------[]

_F000:394A PCIExpressInit:

_F000:394A The function of this subrutine is to initial Northbridge

_F000:394A I think you can check with the datasheet by yourself.

_F000:394A Because some of the register, I do not research before .

_F000:394A What's more, we do not touch these code. If you are

_F000:394A interest into it, you can dig into.

_F000:394A ;[]----------------------------------------[]

_F000:394A

_F000:394A PCIExpressInit: ; CODE XREF: _F000:3745j

_F000:394A mov cx, 54h ; 'T' ; bus 0# dev 0# func 0# Reg 54h

_F000:3A90 jmp di ; PCIExpressInit return

PCIE初始化后面,还有关于北桥那面的寄存器操作,比如:MMIO base address的初始化(后面要用到的哦,尤其是intelMRC也会频繁使用的。),MCHBAR的打开呀什么的,都比较简单啦。不过要提的一下是PCIE的访问方法:(我想网上应该有不少的说明,怎么去访问PCIE的配置空间。)

Register Location = PCI Express Base Address + Bus number* 100000h + device

number * 8000h + function * 1000h + Address Offset

5、进入到MRC

BIOS就真正进入到intelMRC,有两点需要说明一下:

第一,我们再看看_F000:37A8之前有三个byte的数据是没有用到的(如果你反汇编了BIOS,如果没有,直接跳过具体的地址)。也许有人会很纳闷,为什么会这样呀?答案是在BIOS中,写code的时候用了aglin 4的动作。从而代指有三个byte是无意义的。所以我们应该跳过去看。

第二,正如我上面的注释里有说,Memory_INIT这个函数里面有太多的寄存器是intel没有release的了,所以我也不想挨着挨着深入。如果您有兴趣可以看看intel的一本橘皮书,好像是ICH BIOS spec吧。具体我不记得了。里面有详细的描述。

6Memory初始化完了后

内存初始化完了以后,在awardbios里面还会继续detect IGD。代码很简单:

主要是操作北桥的相关寄存器(52H,详细的说明查一下北桥的datasheet)来做的。

都挺简单的,对照着北桥的datasheet就可以查清楚了。(你们查不到的寄存器,我也查不到了。。。。所以有些东西,我其实也不清楚,究竟某些寄存器有啥用。)

8、小结

至此关于BIOSbootblock部分最最重要的目的就算是完成了。因为BIOSrom里面跑而且还没有堆栈,真的很费事,而且速度还慢。所以才要尽快地把内存初始化好,然后把放在ROM里面的BIOS源码都copy到内存中来执行。这样的话不仅提高了BIOS初始化主板的速度,还显得让程序更好写。大致的过程可以看看图1所示。

1 BIOS在不同时期的运行过程图

我要简单描述一下图1的意思。左边其实就是BIOS一直在ROM里面跑的过程。(由于北桥开关的原因,FFFF_0000会被映射到F_0000上去,之前有讲在这里再提一下。)所以在图上仍然以F000段开说明,不要混淆哦。然后到内存初始化好了以后,bootblock的解压缩函数就会把BIOS解压缩到内存中去,然后继续执行(这个时候的BIOS就是真的在实模式下执行的了哦,北桥的开关也就是真的把内存和实际的CPU低端寻址对应了。)。

Bootblock的这部分,我们基本就要结束了,后续我们会看到BIOScopy呀什么的操作。让我们拭目以待吧!!

分享到:
评论

相关推荐

    AMI BIOS代码详解

    **D5** - BOOTBLOCK检查,这是BIOS的一个小部分,能够在主BIOS损坏时引导系统。 **D6** - BIOS校验和,用于验证BIOS代码的完整性和未被篡改。 **D7** - CPUID检查,确认处理器型号和特性,以优化系统性能。 **D8*...

    联想M2630D BIOS .zip

    1. LENOVO-9QKT37AUS.rom:这可能是联想M2630D的原始或默认BIOS版本,大小为2.5M,可能对应了设备出厂时的BIOS固件。 2. LENOVO2-9QKT37AUS.rom:这个文件可能是自定义BIOS大小的版本,扩大到了4M。增大BIOS大小...

    主板BIOS刷新和修复方法

    接着,根据主板所使用的BIOS类型(如Phoenix-AwardBIOS或AMI BIOS),下载对应的BIOS刷新工具(如Awdflash或Amiflash)。通过命令行模式执行刷新工具,并指定新BIOS文件的位置,即可开始刷新过程。需要注意的是,在...

    M6117D BIOS 自检码

    ### M6117D BIOS自检码详解 #### 标题解读 “M6117D BIOS 自检码”这一标题明确指出本文档主要介绍M6117D型号计算机主板上使用的BIOS(基本输入/输出系统)自检代码的相关信息。 #### 描述解析 描述部分重复了标题...

    Project1任务二-开发板BIOS服务调用1

    Project1任务二-开发板BIOS服务调用1 本资源摘要信息是关于操作系统研讨课(2017-2018 Fall)中的 Project1.Task2,主题是开发板 BIOS 服务调用。该任务需要实现一个开发板 BIOS 服务调用,通过调用 pmon 提供的...

    非物理损坏的计算机BIOS芯片的修复.pdf

    BootBlock块是BIOS中用于系统启动的引导模块,如果BIOS刷新失败,但BootBlock块未被破坏,那么可以利用BootBlock块进行修复。修复步骤包括制作系统启动盘、拷贝BIOS升级文件和刷新程序到启动盘上,然后在计算机启动...

    论文研究-基于BIOS和USB盘实现对PC机的安全访问.pdf

    BIOS通常存储在计算机主板上的ROM或Flash Memory中,其中包含了引导代码(BOOTBLOCK)和配置数据(ESCD),以及一系列的中断服务例程。 2. USB(Universal Serial Bus)通用串行总线:USB是一种广泛使用的串行总线标准,...

    修改主板LOGO

    9. **BIOS更新的其他功能**:虽然这次修改主要涉及LOGO,但了解BIOS更新的一般流程也很重要,例如更新BIOS以解决硬件兼容性问题,提高性能,或修复安全漏洞。 10. **法律与许可**:在更换LOGO时,确保你有权使用新...

    ucore lab1 参考答案(转载)

    接下来,使用objdump反汇编bootblock.o,生成bootblock.asm,然后使用objcopy把ELF格式的执行文件bootblock.o转换成二进制格式的执行文件bootblock.out。最后,使用sign执行程序,把bootblock.out扩展到512字节,...

    mkbb.rar_bootblock

    【mkbb.rar_bootblock】是一个与引导块(bootblock)相关的工具,主要目的是为了创建一个适合SRM(System ROM Monitor)控制台微型加载器的引导扇区。在深入讲解这个工具之前,我们先来理解一下引导块和SRM的概念。 ...

    清华大学ucore lab1实验报告.docx

    - `bootblock`依赖于`bootasm.o`和`bootmain.o`,通过`ld`链接生成`bootblock.o`,然后使用`objdump`进行反汇编,`objcopy`将其转化为二进制文件。`sign`程序用于对生成的bootblock进行签名。 1.1.3 **ucore.img...

    电脑各种错误信息提示的中文意思.docx

    本文将详细解析一些常见的BIOS、BIOS刷新失败后的Bootblock、MBR主引导区以及DOS活动分区中的错误信息,帮助用户理解其含义并采取相应措施。 1. BIOS中的提示信息: - Drive A error: 表示软驱A有问题。 - System...

    BIOS安全更新及保护系统设计

    综上所述,该BIOS安全更新及保护系统构建了一个立体的防护网,通过硬件、固件和软件的三层保护,有效防止了恶意软件对BIOS的攻击和篡改,确保了系统的稳定运行和信息安全。这一设计对于提升计算机系统的整体安全性,...

    HP_Z420_Z620_Z820_BootBlock_Upgrade:有关如何使“版本1”的HP Z420,Z620和Z820工作站与Ivy Bridge处理器兼容的指南和资源集合

    HP Z420 Z620 Z820 BootBlock升级 有关如何使“版本1”的HP Z420,Z620和Z820工作站与Ivy Bridge处理器兼容的指南和资源集合。 请参阅此存储库中的PDF以获取指南,并随时发布问题! 相关论坛主题: : 软件Flash...

    AwardBIOS逆向工程指导

    这是一篇Award BIOS逆向工程的文章,可以加深对BIOS工作流程的认知,提到很多我们在逆向工程中经常犯的错误, 是一篇很好的文章

    电脑常见错误提示的中文解释.pdf

    20. **Bootblock启动时的提示信息** - 硬件初始化失败,可能需要检查硬件配置或BIOS更新。 21. **MBR 主引导区提示信息** - 主引导记录(MBR)损坏可能导致无法启动操作系统。 22. **Error loading operating ...

    计算机故障中英文对照表.docx

    2. BIOS刷新失败后的Bootblock启动提示: - Detecting floppy drive A media:检测软驱A的介质类型。 - Drive media is: 1.44Mb1.2Mb 720Kb 360K:显示软驱格式信息。 - DISK BOOT FAILURE, INSERT SYSTEM DISK ...

    计算机常见报警错误信息中英文对照表-电子电路图,电子技术资料网站(宝典指南).pdf

    2. **BIOS刷新失败后的Bootblock启动提示** - **Detecting floppy drive A media...**:检测软驱A的媒介类型,如果失败,可能是软驱问题。 - **Drive media is : 1.44Mb1.2Mb 720Kb 360K**:显示软盘驱动器的容量...

Global site tag (gtag.js) - Google Analytics