小華的部落格: BIOS Code Entry point

搜尋此網誌

網頁

星期日, 5月 06, 2007

BIOS Code Entry point

前一篇說明了CPU如何去讀取第一條存在於BIOS ROM裡面的程式碼,現在就說明一下實際上BIOS Code是怎樣跑的。

這邊要重新說明一下觀念:
FFFF_FFF0 是第一條指令所存放的地方,而他是在4G頂端的地方,CPU在被重置(Reset)之後會去這邊讀取指令,而對CPU來說並不會在意Address FFFF_FFF0 是給BIOS ROM使用還是記憶體DRAM使用,而80386之後,這個位址是都給BIOS ROM使用。

000F_FFF0 (或表示成F000:FFF0),這個位址是在1M 頂端的地方,而這個位址是給BIOS ROM還是DRAM?
給誰使用則是去設定北橋,一般來說在POST 前(Power On-->BootBlock),這個地方應該是給BIOS ROM使用,而POST中途會去做Shadow動作,這個動作做完後,這個位址會給DRAM使用。

以前8088/8086 在1M頂端是給BIOS ROM使用,後來才變成BIOS ROM/DRAM 混用,所以以前CPU被重置的時候是去F_FFF0(F000:FFF0)讀取第一條指令,後來的CPU就不這樣做了。

上面觀念說明完之後我們就實際追蹤一下BIOS code的流程;在進入到OS之後,如果你去看000F_FFF0的資料,其實是看到DRAM裡面的資料,而這個資料是BIOS放進去的;而進入OS之前,這個位址的資料因為預設是給BIOS ROM使用,所以會跟FFFF_FFF0看到的資料一模一樣。

下面是實際上我們去追蹤P廠商BIOS code的範例:
1.我們先利用一些工具去在OS中去存取4G頂端的位址FFFF_FFF0 看到的資料如下所示:
FFFF_FFF0 E9 55 B2 ........... -->實際在BIOS ROM裡面的資料,因為這個位址是給BIOS ROM使用

上面看到的E9 55 B2 就是CPU讀取的第一條指令,而這個指令是一個Jmp 指令,他會跳到BootBlock Entry Point去執行,執行完畢後才會跳到POST Entry point.

2.下面也是在OS中利用工具去讀取1M頂端的資料,由於已經進入OS了,所以這些資料是BIOS填進去DRAM的資料(Shadow),也就是說這個000F_FFF0是被指向DRAM之中。

F000:FFF0 EA 5B E0 00 F0 ..... -->跳到F000:E05B
F000:E05B E9 FB A8 ........... -->跳到實際的POST Entry point....
A8FB+E05E=8959 (進位1 去掉)
F000:8959 FA ................. -->FA=CLI

這邊可以看到為了相容性問題,所以000F_FFF0是放著Jmp F000:E05B 位址,而這個位址裡面會放著POST Entry point指標(E9 FB A8),所以繼續追蹤過去後可以發現POST的第一條指令是CLI...

3.其實CPU第一條指令E9 55 B2 會跳到BootBlock去執行;而執行完畢後,BootBlock也會跳到跟F000:8959內一樣的BIOS code去執行所謂的POST。

所以簡單的描述上面所說的流程:
1.CPU去FFFF_FFF0 提取第一條指令執行(Jmp BootBlock)
2.執行BootBlock
3.執行完bootBlock後,跳到POST
4.執行POST (POST第一條指令一定是CLI)
5.POST過程中Shadow ,Shadow後000F_FFF0的資料就是Jmp F000:E05B

這樣子說應該很容易瞭解了吧! ^^Y

沒有留言: