迅维网
标题: 关于POST过程和CPU首地址的个人理解!~ [打印本页]
作者: confucian 时间: 2015-6-3 00:08
标题: 关于POST过程和CPU首地址的个人理解!~
本帖最后由 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次变成一个有规律,并且相对简单的波形,表示自检 过显卡了(当然也要看示波器的时基怎么调的)
作者: luobr1988 时间: 2015-6-3 07:50
没看的懂哦,啥意思
作者: YLL 时间: 2015-6-3 09:41
再接再厉。。。
作者: confucian 时间: 2015-6-3 09:42
多谢杨老师鼓励~!
作者: confucian 时间: 2015-6-3 09:51
再看看,重新编辑过了
作者: windlovetao 时间: 2015-6-3 09:54
逛了各大论坛都无法学会BIOS合成?有这么困难吗,我记得当时老师只教了不到半小时就学会了
作者: confucian 时间: 2015-6-3 09:57
方向走错了!~~逛着逛着就去研究BIOS内部结构~!害得我还拿汇编语言学了一遍(只学了一半)!~~感觉研究BIOS,对硬件底层的认识会更深刻
作者: huhaju 时间: 2015-6-3 10:34
没有多大实际意义,我也看了好多这样的资料,在维修中意义不是很大,因为你要找的故障基本就是那几个东西
作者: confucian 时间: 2015-6-3 10:40
感觉了解一下对,有复位不跑码,或者跑码中断,跑码不显或者死机类故障。还是有点实际意义的!~而且让你对一些CPU,和桥里的信号有更深的理解。因为这些信号工作的时候都是有一定的逻辑关系,不是说你翻译一下datasheet就能看明白的!~
感觉pci规范,和ACPI有空的时候看看中文版的,大概了解一下很好!~
作者: huhaju 时间: 2015-6-3 10:51
是 的,以前有这个热情去研究这些,现在没有热情了,修多了,人变懒了
作者: confucian 时间: 2015-6-3 10:55
呵呵,我现在也是没事做,闲得蛋疼研究下,就当做充充电吧。。
作者: confucian 时间: 2015-6-3 11:01
现在想研究一下,CPU具体会在收到什么信号的情况下会关闭FSB。。从目前获得的资料来说,CPU的工作状态不对,会关闭FSB。宕机也会关闭FSB。。。但搞不清楚是宕机才关闭FSB,还是关闭FSB才宕机。
作者: 152916623 时间: 2015-6-3 11:10
又一位大神横空出世了,我等顶礼膜拜啊
作者: confucian 时间: 2015-6-3 11:15
呵呵,话不是这样说!~一般大神都不会拿这些来出讨论,只有我们这种学得半懂不懂的,才想拿出来讨论一下
!~~
话说我到大神境界也藏着掖着了~!!
作者: 加勒比i7 时间: 2015-6-3 11:44
赞一个 学习了
作者: huhaju 时间: 2015-6-3 17:41
对于这些研究不是我们这些一般的维修人员可以研究透的,对于总线本身而言应该不存在关闭不关闭吧,应该是正常不正常
作者: wchj5120 时间: 2015-6-16 07:39
研究这个真没实际意义,等你修机器的时候 都用不上,
作者: shunfenglang 时间: 2015-6-16 08:04
分析的不错太详细了, 谢谢分享 很有用
作者: luman1233 时间: 2015-6-16 08:47
看不懂写得啥
作者: 月饼 时间: 2015-7-1 08:01
研究精神可嘉
也欢迎多多发表研究作品
不过我也当年学晕了,觉得对维修意义不大,所有很快忘记了
什么A20#,什么跳转,还用单步卡根据每一步研究跑到什么地址位出错。。。唉全部忘光了
| 欢迎光临 迅维网 (https://www.chinafix.com/) |
Powered by Discuz! X3.4 |