【我所认知的BIOS】->反汇编BIOS之Bootblock(2)
--CPU micro code update
By Lightseed
5/12/2010
1、CPU micro code的背景
先做个铺垫为什么要在BIOS刚刚开始跑的时候就来讲CPU的micro 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里, 一般要包进若干个ID的CPU微码, 以便工厂安排不同的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微码是否加载?
加载微码后, 在CPU的MSR(机器特定寄存器)里可以读出版本号. INTEL IA-32编程手册上给出标准检查方法:
MOV ECX, 008bh
XOR EAX, EAX
XOR EDX, EDX
WRMSR ;向MSR 8BH写0, 清除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里面究竟存了什么值。(其实就是CPU的type。)
在加注的时候,其实我个人更喜欢用英语注释哈。但是在之前有人说想要我用中文注释,想了又想,其实真的没有必要。如果连这点英语都看不懂,那么我想看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的最开始就针对特殊的CPU做patch。那么我就来详细和大家说说这个函数。
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打开之前说的那个BIOS的BIN来看看,如图1

图1
从图1中可以看出,“*BS1”是处于bin文件中的6000段的,也就是BIOS在实际跑中的E000段。所以和代码中的段刚好符合。如果把整个E000段都找完了还是找不到的话,那么就说明没有这个部分的micro code,直接就return了。
③_F000:005B这行是为了得到CPU micro code的base address。这个地址是CBROM填入了,我们可以不用care它。只需要知道从这里可以得到CPU micro code就好了。见图2 bin文件中实际的micro code位置FFFE_57E0H。

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

图3
而牵涉到CPU的micro 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这行主要是初始化MSR的79H。关于它的说明也是在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。
至此关于CPU在Bootblock的时候升级micro code的动作就做完了。其实在后面POST的时候,也会有这样的动作,但是原理都是一样的。(稍微有些些差别)我们理解原理就好啦。呵呵。。。希望大家喜欢。
分享到:
相关推荐
接下来,使用objdump反汇编bootblock.o,生成bootblock.asm,然后使用objcopy把ELF格式的执行文件bootblock.o转换成二进制格式的执行文件bootblock.out。最后,使用sign执行程序,把bootblock.out扩展到512字节,...
这是一篇Award BIOS逆向工程的文章,可以加深对BIOS工作流程的认知,提到很多我们在逆向工程中经常犯的错误, 是一篇很好的文章
通过对比反汇编代码与源代码(如`bootasm.S`和`bootblock.asm`),加深对代码执行的理解。 3. **实模式到保护模式的转换**:在bootloader中,转换的关键步骤包括清零标志、开启A20线以启用32位地址空间、初始化全局...
11KW OBC两电平pfc+cllc仿真源码实现:单相与三相兼容版双向控制研究,11KW OBC两电平pfc+cllc仿真源码实现:单相与三相兼容版,实现双向控制策略,11KW OBC两电平pfc+cllc仿真,源代码实现。 注意:已成单相,三相兼容版仿真文件。 双向控制。 ,核心关键词:11KW OBC两电平pfc; CLLC仿真; 源代码实现; 单相三相兼容; 双向控制。,11KW OBC单相与三相兼容版仿真:两电平PFC+CLLC双向控制源代码实现
3GPP R15 38.331 5G NR无线资源控制(RRC)协议规范解析
五运六气YUNQI_V471_SRC_D1023
19考试真题最近的t63.txt
基于MATLAB的牛拉法电力系统潮流计算程序,结合BPA方法,附参考文献,适合基础学习与拓展创新,基于MATLAB的牛拉法电力系统潮流计算程序:涵盖基础学习与拓展创新,附参考文献,牛拉法电力系统潮流计算 MATLAB编写潮流计算程序 BPA计算潮流 另外包含参考文献 这个程序把潮流计算的一般流程包括了,非常适合基础学习,并进一步的进行拓展创新 ,牛拉法; 电力系统潮流计算; MATLAB; BPA计算; 程序编写; 流程; 基础学习; 创新拓展,基于MATLAB的牛拉法电力系统潮流计算程序:基础学习与拓展创新指南
YOLOv11m权重文件
高一-语文-2025年1月张家界市高一期末联考-缺考不计、违纪不计、0分不计_2025-01-16-12-21 (1).zip
android kotlin 版本的贪吃蛇游戏
19考试真题最近的t57.txt
基于疫情封控区域的生活物资配送优化模型:结合遗传算法与模拟退火,实现时间最短和综合满意率最高的路径优化。,疫情下封控区域生活物资配送优化模型:结合遗传算法与模拟退火算法求解路径优化问题,实现时间与满意率双重目标优化。,模型及MATLAB代码:考充分考虑并结合疫情下封控区域生活物资配送问题及车辆路径问题的特点构建物资配送优化模型。 在一般单一目标——时间最短的基础上,加入综合满意率优化目标的路径优化问题 关键词:遗传算法、改进、模拟 火算法,路径优化、CVRP 完整模型+代码+注释 主要内容:以配送时间最短及综合满足率最高为目标,充分考虑并结合疫情下封控区域生活物资配送问题及车辆路径问题的特点构建物资配送优化模型,为疫情下生活物资配送找到了更好的思路。 在模型设计与求解问题上,首先设计标准遗传算法,继而对算法加以改进,最后设计出了改进遗传-模拟 火算法对模型进行求解。 还有参数灵敏度分析等。 服务内容:脚本 工具 部分展示如下: ,关键词:疫情下物资配送;车辆路径问题;优化模型;遗传算法;改进;模拟退火算法;CVRP;参数灵敏度分析;脚本工具;时间最短;综合满意率。 核心关键词用分号分
## 01、数据介绍 动态能力理论最早由提斯(Teece)与皮萨洛(Pisano)于1994年正式提出,他们将动态能力定义为“能够创造新产品和新过程,以及对变化的市场环境做出响应的一系列能力”。 动态能力具体体现在吸收能力、创新能力和适应能力三个方面。这些能力使公司能够快速适应市场变化,抓住新的商业机会,从而保持或提升竞争优势。 数据名称:上市公司-动态能力数据 数据年份:2012-2023年 ## 02、相关数据及指标 证券代码 证券名称 年份 Symbol RD IA ACV DC
基于ASIO的插件式服务器,支持TCP, UDP, 串口,Http, Websocket,统一化的数据接口,隔离开发人员和IO之间的操作。可以快速迭代。PSS 是针对不同 IO 逻辑的插件管理系统。您可以忽略 IO 建立的细节,构建自己的 logic 应用程序。PSS 封装了 Tcp、udp、kcp、串行端口、http、websocket 和 ssl 的统一接口。您可以使用 配置文件 或 统一接口 来创建和使用它们。logic plug-in 是完成数据到达后的 logic 处理,全部以动态库的形式加载,将 IO 和 logic 本身的耦合分开。简单的逻辑开发。本项目由三部分组成 (1) 主机(2) 数据包分析插件(3) 逻辑处理插件。您可以实现后两个插件来完成您的业务逻辑部署。
电机控制器源码:通用无感BLDC方波控制,高效参数化启动,转速达12w,环控系统一键调节,电机控制器源码:通用无感BLDC方波控制,高效调速,参数宏定义便捷调试,最高电转速达12w,电机控制器,低压无感BLDC方波控制,全部源码,方便调试移植 1.通用性极高,图片中的电机,一套参数即可启动。 2. ADC方案 3.电转速最高12w 4.电感法和普通三段式 5.按键启动和调速 6.开环,速度环,限流环 7.参数调整全部宏定义,方便调试 代码全部源码 ,电机控制器;低压无感BLDC方波控制;全部源码;通用性极高;电转速最高12w;电感法与普通三段式;按键启动调速;开环、速度环、限流环;参数调整宏定义。,通用电机控制器:低压无感BLDC方波控制源码,支持高转速12W,便捷调试移植
基于MPC的电动汽车分布式协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的电动汽车协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的分布式电动汽车协同自适应巡航控制,采用上下分层控制方式,上层控制器采用模型预测控制mpc方式,产生期望的加速度,下层根据期望的加速度分配扭矩;仿真结果良好,能够实现前车在加减速情况下,规划期望的跟车距离,产生期望的加速度进行自适应巡航控制。 ,关键词:MPC(模型预测控制); 分布式电动汽车; 协同自适应巡航控制; 上下分层控制方式; 期望加速度; 扭矩分配; 仿真结果良好; 前车加减速; 跟车距离。,基于MPC的分层控制电动汽车自适应巡航系统,仿真实现前车加减速跟车距离自适应
多维度购电与售电模型构建及基于CVaR与WOA优化的收益风险评估方法研究,基于CVaR风险评价及WOA优化的新型售电公司购售电模型与策略仿真研究,建立了一个电公司的购电侧模型和电侧模型,其中购电侧模型包括长期市场业务,现市场业务,可再生能源购电市场业务,分布式电源购电市场业务以及储能租赁市场业务五种类型。 电侧包括均 电价合同和实时电价合同两种类型。 然后在购电模型的基础上,提出了一种基于CVaR的购电收益风险评价方法。 根据电公司的CVaR购电收益风险数学模型,提出了一种基于WOA优化算法的新型购电收益计算方法。 该方法将购电收益风险计算公式作为WOA优化算法的目标函数,然后通过WOA的鲸鱼行走觅食、鲸鱼包围以及鲸鱼螺旋捕食三个步骤计算电公司的最优购电策略。 最后,通过MATLAB仿真工具对本文所研究的基于WOA优化的新型购电收益计算方法进行了仿真分析。 仿真结论验证了通过WOA优化算法得到的购电策略为最优购电策略。 matlab代码 仿真平台:MATLAB平台 代码具有一定的深度和创新性,注释清晰 ,关键词: 1. 购电侧模型; 2. 售电侧模型; 3. 长期/现货/可再生
迅雷软件下载原理介绍.md
## 01、数据简介 碳排放是指在人类活动中,如能源消耗、工业生产、交通运输、农业活动等过程中向大气中释放的二氧化碳等温室气体的行为。这些温室气体在大气中形成隔热层,导致地球气温升高,引发全球气候变化。分行业碳排放则是指按照不同的经济活动或产业部门来划分和统计碳排放量。 按省市县整理成面板数据,其中包括电力行业、工业过程、工业燃烧、建筑物能源、浪费、农业、燃料能源和运输八种指标排放量各省市县的最大值、最小值、平均值、总和。 数据名称:省市县分行业碳排放月度数据 数据年份:2023年 ## 02、相关数据 name 指标 时间 数值 更多数据 ## 03、数据截图