马上注册,获取阅读精华内容及下载权限
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 confucian 于 2015-6-3 11:55 编辑
最近刚从迅维学完手机回来,暂时没找到事做,闲着无聊想着研究下BIOS 合成,分离。走遍各大论坛,查阅了大量资料后,发现BIOS 合成没学会,反而对POST过程及CPU首地址有了更深刻的理解,经过整理作为前一阶段学习总结和大家分享一下!不当之处请各位看官指正,一起学习,共同进步! 1、 CPU寻址模式: 实模式(real mode )20位寻址,A20#信号就是这个模式的标志,在 实模式下,物理地址=段地址*16+偏移地址 。
Big Real Mode(32位寻址,介于实模式和保护模式之间,也正因为有此模式,才使得CPU在POST阶段能有超过1M的寻址能力)
保护模式:32位寻址,此模式可以粗略理解为在操作系统下CPU的寻址方式。具体的可以百度,此模式不在本章讨论范围!~
关于首地址FFFF_FFF0H(X86架构CPU复位后会将CS:FFFF 0000 EIP:FFF0; X86地址结构比较复杂,已经不是物理地址*16+偏移地址这么简单了。关于CPU首地址FFFFFFF0 :见新的IA32&64手册,第8章 CHAPTER 8PROCESSOR MANAGEMENT ANDINITIALIZATION 而早前的8086 CPU在reset后会把指令段寄存器CS:FFFF,指针寄存器IP:0000。这是设计CPU时的内部结构决定的,CPU规定在任何时刻都从CS:IP指向的地址,取代码执行!~也就是说8086 CPU 复位后会从FFFF:0000(物理地址FFFF0H)处取指令。而这个地址必定指向BIOS ROM。即使CPU升级到X86架构,为了向下兼容,在POST前仍沿袭这种方式。这个用IDA反汇编BIOS.bin文件可以看到FFFF0处就是BIOS第一条 far jmp指令。换句话说,你想找BIOS第一条指令,就用IDA找FFFF:0000
现在问题来了,首地址究竟是FFFF FFF0H还是FFFF0H呢??大家都知道0~FFFFFFFFH表示的是4G的空间:FFFF FFF0H则表示4G最高位地址减去16字节!0~FFFFFH表示的是1M的空间:FFFF0H则表示1M最高位地址减去16字节。而我们的BIOS ROM 有的仅为512K,最大的仅为8M,还有2M,4M的!那以上的首地址是如何定位BIOS 里第一条指令的?
这里就需要依靠南北桥去解码了,而解码后的地址必为 BIOS ROM最高位地址减16字节,即2M/4M BIOS的地址为1FFFF0/3FFFF0。这也就是为什么BIOS都是从文件的后面开始执行的的原因!~
由此可见,首地址这个概念对于不同器件有不同理解: 对于CPU来说是FFFF FFF0H(有资料说CPU在执行第一条转跳指令之后,就会进入实模式寻址,这个要实物验证才知道)
对于内存来说是FFFF0H(当然,在刚开始寻址的时候内存还没初始化,但是等BIOS的bootblock模块执行完后,把BIOS COPY到内存里时,那在内存里首地址就为FFFF0H)
对于BIOS来说是 ROM的最高地址减16字节!
关于转跳指令:因为不管首地址是FFFF FFF0H还是FFFF0H或者是1FFFF0/3FFFF0,剩下的都只有16字节的空间,根本不足以放POST的代码,所以必须得有一条指令去给CPU的CS:IP寄存器重新赋值,让CPU转跳到能真正取得POST代码的地方,而这个地址必定在1M的范围内(多数BIOS为E05B这个地址),只有这样CPU才能进入实模式寻址!~~
PSOT过程:
CPU取到第一条指令转跳到E05BH之后,接下来会做什么呢??此章以award BIOS 分例(awrad已和Phoenix 合并) PS:CPU进入实模式寻址,A20#低电平(未经验证)
1、首先会初始化CPU,更新CPU微码。大家都知道,在设计产品的时候或多或少都有留有BUG,早期的intel CPU是没有CPU微码的,所以一旦发现产品出现BUG就要大量回收。。后来为了弥补这些损失,设计人员想出用微码来确决BUG。让CPU在初始化之后先自我修复一下。(没有CPU微码有时会出现一会奇怪的问题,这也是有人说有的4代换CPU后要刷BIOS。当然也有可能是EFI文件的问题,这个还要深入研究一下)
2、初始化芯片组(南北桥)的寄存器
3、初始化EC
4、record_CPU_type_COMS:这里不太明白,看字意好像是记录CPU的COMS类型??
5、如果没重新进入SLP x,就接着初始化内存:意思大概就是此时南桥仍然在S0状态,就初始化内存。在此之前南桥会通过SMB总线读取内存信息,此时示波器打SMB有波形了
6、基本内存检测,并把BIOS copy进内存:此时用示波器打内存AD线开始有波形了,如果POST在此中断,你会发现波形一闪而过(闪一下就没了)
7、解压BIOS: BIOS在内存里不是一次解压完的,,而是用到哪个模块再解压哪个模块
8、此时bootblock模块执行完毕,开始POST(上电自检) ,此时内AD线有大量波形,正常跳变2-3次变成一个有规律,并且相对简单的波形,表示自检 过显卡了(当然也要看示波器的时基怎么调的)
|