在此将以DeskTop platform来说明(Notebook platform 的 power-on sequence 牵涉到 EC,可参考讨论区中 "power on sequence" 文章);还有,所叙为rough flow(粗略流程),详细的时序图依据design会有些许不同.
<Power-On sequence>
- AUX(附加接口?) power ok
- Main power ok
- PCI reset
- SB state-machine runs...
- NB state-machine runs...
- CPU power-Good ok
- CPU reset
- 1st code-read by CPU ( <- BIOS entry point,即 CPU 会抓取 FFFFFFF0h 处的 BIOS code 来执行)
(* 当然CPU一次抓取的BIOS data不仅仅是几个Byte ! 而是一堆的data(Ex. 64 bytes);之后会从中 extract 出 FFFFFFF0h处的 data,然后来执行.)
自 此,CPU便循着 CPU->NB->SB->ROM 的 path,循序地至BIOS ROM中抓code,执行 fetch->decode->calculate->store...自此开始便是BIOS POST stage starts...
<有可能遇到的问题是> debug code = "00" or "FF" (意即BIOS常用的 Port80 card所显示出的 "code" ) !!!
(此时,强烈建议:请在BIOS entry point 处 丢Port 80(value可自行定义),因为,即使BIOS有跑到,但因为距离 1st 丢 Port80 的 code仍有一小段程序代码;若系统 hang在此其间,Port80仍是没有 code,因此,在BIOS一开始进来便先 out Port80 将有助于判定: system hang before BIOS entry point or NOT !!! )
# Assume system hang 'before' BIOS entry point
可能的原因有:
- incorrect power sequence: 此 sequence 有 spec,规范讯号间的相对关系与 assert/deassert的时间,violate spec有可能导致 system hang;此时需要 H/W or board designer来量测
- incorrect power-on frequency:有发生过因为 Power-On CPU frequency错误而不开机者.请用 scope量测
- incorrect chipset behavior: 意即上述的 power-on sequence中有关于 NB/SB的 state-machine部分,有可能这部分的行为不正常,因此需要 H/W designer来 clarify
( 曾听说,某家chipset需要BIOS image 中 include 几个 bytes 来 config NB/SB的 registers;这些 settings也会影响 power-on时 chipset的 behavior;因此,这几个 byte 若是错的,也有可能 system hang)
#Assume system hang 'after' BIOS entry point
=> 这就是BIOS engineer的时间了,就 debug吧...(尽管,有些 issue 是 board or H/W造成的...)
* 此时的 debug方式,若有 辅助工具的(Ex. P debug card) 就用,没有的就用Port80 card啰 !
<Summary>: 没进入到 BIOS entry point前....不要找我....真的没办法 >_<
* 关于 BIOS entry point,请参考 讨论区中 "追踪BIOS code 的进入点" 文章 !!!
关于BIOS entry point,有两个东西提供给大家参考:
1. 假设BIOS image is 512KByte. 利用ultraedit 并切换至Hex format来 open this BIOS image. 找到 offset 7FFF0 处,将原先的 machine code 改成 <mov al, 66h;out 80h, al>的 machine code;存盘,然后将该 image刻录到原先的ROM上. 开机后就可以发现:Port80 is "66". (当然之后无法开机...因为已经破坏了BIOS content...你改的正是 1st CPU会抓取并执行指令的地方 !!!)
2. [Q] 承上,一样是 512KB ROM, 此时,若将一个 down-size 256KB BIOS image刻录到ROM上,再开机...会发生什么事呢 ? 原因是...^_^...
补充一下好了. 为什么CPU 发的第一个位置不会只有FFFFFFF0h? 而是多抓很多个? 范例中为什么是64 bytes?
原因在于 cache的支持. cache不是细分为单一byte 的, 而是以block(many bytes)为单位. 这个block的大小的名词就是 cache line size. 也就是要填入cache一次要写入的bytes量. 例如 cache line size 为 16 bytes. 那么一次就要读16 bytes到cache去.
CPU 一但发生cache miss(第一次开机一定是cache miss)的状况时.就会通过host bus 对外取得资料. 这时就会产生burst read cycle来达成fill cache line的需求. 所以由CPU 的 cache line size的大小就可以知道CPU一次会抓多少的 bytes. P4以后CPU 的cache line size 为 64 bytes, 所以CPU 就会产生一个 burst length 为8 的 memory read cycle. 所以CPU 发出的位置就需往下减.然后在读取的数据中可以包含到 FFFFFFF0h以后的数据.
阅读全文类别:我所知道的bios系列整理(转载小华的部落格) 查看评论