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

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

阅读更多

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

--CPU micro code update

By Lightseed

5/12/2010

1CPU micro code的背景

先做个铺垫为什么要在BIOS刚刚开始跑的时候就来讲CPUmicro code

以下引用自网络:

-------------------------------------

在十多年前的Pentium时代, INTEL曾经发布过有缺陷的CPU, 因为浮点运算表边界上有几个数据错误, 导致在某些应用会出现错误, 这个错误概率很小, 出错几率小于千万分之一, 但在还是被捅出来了. INTEL为此召回CPU.

Pentium Pro, INTEL决定给CPU留出一个补丁接口, CPU内部有缺陷的时候, 通过加载微码(Microcode), 可以修复CPU的部分缺陷.

INTEL, 他们只测试过的CPU都是加载了微码的, 如果没有加载微码, INTEL不保证会出现什么问题.

现在的CPU有一个CPUID, 通过执行CPUID指令, 可以知道当前CPU的版本和Stepping. 根据这个信息, 再给CPU打相应的补丁.

下图就是CPUID=06D2, Rev.A2

何时给CPU打补丁?

在给CPU初始化的时候, 就需要把INTEL提供的微码写进CPU, 因此, 加载CPU微码就是系统BIOS的任务.

如果系统的CPU是可更换的, 那么其微码也需要更换. 因此, BIOD, 一般要包进若干个IDCPU微码, 以便工厂安排不同的SKU出货. 如果BIOS发布是在CPU发布之前, 那么BIOS里很可能就没有包进最新的微码, 这个系统要使用新CPU的时候, CPU微码是无法加载的.

另外, BIOS ROM容量有限, 一个微码补丁最小有2K, 如果平台兼容的CPU很多, 则微码数量是十分巨大的, 台式机某些主板可能兼容20多个CPU版本, 那么微码的体积很大, BIOS里根本包不下这么多东西, 于是, 厂商不得不缩水, 去掉一些不常用的微码. 这些不常用的微码一般都是早期的CPU, DOTHAN早期的A STEPPING就很可能没有对应的微码包进你的本本中去.

不打补丁会有什么问题?

INTEL说他们没测过不打补丁的CPU, 也就不知道会出什么问题. 呵呵, 这显然, 他们不想说太多技术细节而已. 以俺的经验, 如果不打补丁, 99.99%的时候, 用户是感觉不到的, 除非问题特别突出. 只是俺遇到过几个明显的例子, 为此出了几身汗. 有几个案例:

1, Prescott CPU, 在台式机上发热量特别大, 超出Design Point, 后来发现没加载微码, 加上微码就正常了;

2, Pentium D CPU, WINDOWS XP会蓝屏, 以安全模式进去后, 安装一个SP2补丁, 就正常了. 后来查出, 也是微码没加载;

3, Pentium M架构CPU, 在使用CPU内部TSC, 发现测出的CPU内部频率高出实现的4, 2GHz CPU测出却有8GHz, 后查, 也是没加载微码造成的异常.

此类案例很多, 特别是Core架构CPU, 不但微码必须加载, 而且要求尽早加载, 否则, BIOS都跑不完, 系统就挂了. 但是INTEL但至今没有任何官方对每个CPU微码版本进行描述的文件.

怎么检查CPU微码是否加载?

加载微码后, CPUMSR(机器特定寄存器)里可以读出版本号. INTEL IA-32编程手册上给出标准检查方法:

MOV ECX, 008bh

XOR EAX, EAX

XOR EDX, EDX

WRMSR ;MSR 8BH0, 清除MSR中的信息

MOV EAX, 0001

CPUID ;CPUID, CPU查看微码版本, 并把微码版本送到MSR 8B

MOV ECX, 008bh

RDMSR ;读出当前CPU微码版本

执行上面的代码后, 如果EDX的值为0, 则说明你的CPU微码是没有没加载的, 你的CPU运行在有缺陷的状态. 如果不为0, 则显示的是当前微码版本号

以上代码可以在DOS环境下, DEBUG32调试界面执行.

----------------------------------------------------

2、来来来,动手反汇编了!!!

2.1 BIOS开始的代码

如果您做了前两篇的东西,那么您会不难反汇编到这里来,(F000_FFF0跳到F000:E05B,然后再一个near jmp到了F000:E1B0)也就是下面这段代码。这段代码也就是Award BIOS最开始的代码部分了。

之前我们有研究过,当CPU 收到reset信号后它内部会做一系列的动作,而且当第一次从FFFF_FFF0H处取指令执行的时候,还会在对应的寄存器中保存一些相关的信息。在

http://blog.csdn.net/lightseed/archive/2009/10/27/4735101.aspx

中的图1您可以看到DX里面究竟存了什么值。(其实就是CPUtype。)

在加注的时候,其实我个人更喜欢用英语注释哈。但是在之前有人说想要我用中文注释,想了又想,其实真的没有必要。如果连这点英语都看不懂,那么我想看datasheet也估计很困难。所以最后还是确定用English来注释。注解有误的话,还往各位谅解并指正,我会尽快修正。

_F000:E1B0

_F000:E1B0 loc_FE1B0: ; CODE XREF: _F000:E05BJ

_F000:E1B0 mov gs, dx ; Save CPU type to GS

_F000:E1B2 cli ; Close interrupt

_F000:E1B3 cld

_F000:E1B4 mov ax, cs

_F000:E1B6 mov ss, ax ; CS and SS use the same segment, that can use ROM_CALL

_F000:E1B8 mov sp, 0E1BEh ; First Use ROM_CALL

_F000:E1BB jmp BT_CPU_Init ; Save esp (Return Address)

这段代码也就是BIOS开始两个JMP后的代码,应该说比较好理解。在E1B8这里BIOS第一次用了上一节中提到的ROM_CALL这个宏。也遇到了第一个函数。BT_CPU_Init其实是在CPU开始跑code的最开始就针对特殊的CPUpatch。那么我就来详细和大家说说这个函数。

2.2 CPU micro code update

关于这个函数,原本我是有反汇编的源代码的,代码不复存在,但是原理却能够说清楚。(下面的说明,基本上就是这个函数所作的所有动作。反汇编出来的地址,其实我们可以暂且跳过,看原理就好。)

上面micro code update的全部函数。一些简单的动作,我也在code中注释了。我着重拎一些不太好懂的说说。

_F000:0036在这行中,主要是先对比一下CPU是否为Cedar Mill B1,如果不是那么这个函数就不用跑了。Patch当然也就不用做了。(如果你照着我之前做的动作,那么这个行数应该是能对的上的,但是就算对不上也没有关系。只看我的算法讲解就可以了。)至于code的细节嘛,那你就自己慢慢体会吧。

_F000:0049在这行中,有一个对比的指令,其实很明显可以猜到这就是CPU micro code的标志。

_F000:0049 cmp dword ptr [esi], '1SB*' ; Compare if it is CPU micro code?

让我们用ultraedit打开之前说的那个BIOSBIN来看看,如图1

1

从图1中可以看出,“*BS1”是处于bin文件中的6000段的,也就是BIOS在实际跑中的E000段。所以和代码中的段刚好符合。如果把整个E000段都找完了还是找不到的话,那么就说明没有这个部分的micro code,直接就return了。

_F000:005B这行是为了得到CPU micro codebase address。这个地址是CBROM填入了,我们可以不用care它。只需要知道从这里可以得到CPU micro code就好了。见图2 bin文件中实际的micro code位置FFFE_57E0H

2

紧接着,我们可以从对应的地址处看到实际的CPU micro code。如图3

3

而牵涉到CPUmicro code那么就不得不提它的结构。从micro code的第0个字节算起,会有如下一个表。

CPU micro code开始几个flag

HeaderVersion

;offset 00h

UpdateRevision

;offset 04h

UpdateData

;offset 08h

ProcessorVersion

;offset 0ch

Checksum

;offset 10h

LoaderRevision

;offset 14h

Platform_ID

;offset 18h

DataSize

;offset 1ch

TotalSize

;offset 20h

Reserved

;offset 24h

Update_Data

;offset 30h

有了这几个说明,我想从Update_Micro_code_Start:开始的那些EBX+XX之类的比较就应该没有什么问题了哦。看看图3中,我还给大家标了一些标志出来。您可以追追看。

_F000:0080_F000:0086两行操作的是MSR寄存器17H。它的说明在3 B里面有说,以下是截图。

_F000:0080 mov ecx, 17h

_F000:0086 rdmsr

4

_F000:00A2这行主要是初始化MSR79H。关于它的说明也是在3B里面见图5所示。

_F000:009B mov eax, ebx

_F000:009E add eax, 30h ; '0'

_F000:00A2 mov ecx, 79h ; 'y' ; MSR register to update micro code

_F000:00A8 xor edx, edx

_F000:00AB wrmsr

5

经过那么多的判断后,最终只确定了一件事,那就是目前的CPU确实是应该update以下它的micro code了,于是在_F000:00AB wrmsr命令执行后,CPU开始升级它的micro code

至此关于CPUBootblock的时候升级micro code的动作就做完了。其实在后面POST的时候,也会有这样的动作,但是原理都是一样的。(稍微有些些差别)我们理解原理就好啦。呵呵。。。希望大家喜欢。

分享到:
评论

相关推荐

    AMI BIOS代码详解

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

    联想M2630D BIOS .zip

    描述中提到了“万能BIOS备份工具”,这类工具如Award Bootblock BIOS Recovery、AMI BIOS Backup等,能够帮助用户安全地备份现有的BIOS到ROM文件,以防意外情况导致BIOS损坏,从而无法启动计算机。备份BIOS是一个...

    主板BIOS刷新和修复方法

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

    M6117D BIOS 自检码

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

    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

    2. **备份原BIOS**:在进行任何BIOS修改之前,最重要的是确保有原始BIOS的备份,以防修改出错导致无法正常启动。可以使用工具如Award BootBlock BIOS Recovery或Flash Utility来备份。 3. **获取新LOGO**:新LOGO...

    mkbb.rar_bootblock

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

    ucore lab1 参考答案(转载)

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

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

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

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

    2. BIOS刷新失败后的Bootblock启动提示: - Detecting floppy drive A media: 检测软驱A介质,可能是在寻找启动设备。 - DISK BOOT FAILURE: 磁盘引导失败,检查启动设备和系统盘。 3. MBR主引导区提示信息: - ...

    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