?? 起源 .txt
字號:
起源
作者:iKs 于2007-10-15上傳
--------------------------------------------------------------------------------
一位著名的科學家(據(jù)說是貝特郎·羅素)曾經(jīng)作過一次關(guān)于天文學方面的講演。他描述了地球如何繞著太陽運動,以及太陽又是如何繞著我們稱之為星系的巨大的恒星群的中心轉(zhuǎn)動。演講結(jié)束之時,一位坐在房間后排的矮個老婦人站起來說道:"你說的這些都是廢話。這個世界實際上是馱在一只大烏龜?shù)谋成系囊粔K平板。"這位科學家很有教養(yǎng)地微笑著答道:"那么這只烏龜是站在什么上面的呢?""你很聰明,年輕人,的確很聰明,"老婦人說,"不過,這是一只馱著一只一直馱下去的烏龜群啊!"
時間簡史 第一章 我們的宇宙圖像
無論是初學電腦的還是玩電腦許多年的人,都會對PC如何啟動非常感興趣。遺憾的是這方面的資料非常少,我下面要介紹的就是PC如何啟動第一條指令,它在什么地方。
陳舊的資料都會說第一條指令在1MB之下的一點點,隨便打開一個BIOS,在文件的末尾都會有這樣的指令:
使用Debug工具反編譯就是下面的語句:
-U F000:FFF0
F000:FFF0 EA5BE000F0 JMP F000:E05B
直接察看你的電腦也是這樣的結(jié)果。但是,資料中又說BIOS ROM是處在4G下面開始的位置的。具體舉例,一個2MB的BIOS,他的文件尾吧正好處在4G下面一點的位置,文件的頭是處于 4G-2MB 的位置。量化表示就是這樣的對應關(guān)系:
影射在內(nèi)存尋址空間 文件偏移
FFD0,0000<―――――――――>0hdcmap
FFEF,F(xiàn)FF0<―――――――――>F,F(xiàn)FF0hdcmap
FFE7,F(xiàn)FF0<―――――――――>17,F(xiàn)FF0hdcmap
FFFF,F(xiàn)FF0<―――――――――>1F,F(xiàn)FF0hdcmap
開機時,CPU 將會從 0FFFF,FFF0h 處開始執(zhí)行,就是對應在 2MB 文件 1F,FFF0h 的位置。這里有2點問題:
1.我們開機不插內(nèi)存,它是到哪里執(zhí)行的?
2.你怎么知道 CPU 是從這個位置執(zhí)行而不是那個位置?
第一個問題是:它是在 BIOS ROM 中開始執(zhí)行的。目前的 BIOS ROM 是一種可擦寫的 Flash ROM,通常在南橋上。
開機之后,CPU 要訪問 0FFFFFFF0h 處的數(shù)據(jù),問北橋,北橋看看不在他的掌控下回頭就去問南橋,南橋繼續(xù)通過 LPC 或者 SPI 總線問 BIOS,取出來再一路返回給 CPU,然后 CPU 就知道了執(zhí)行各種指令。
第二個問題,CPU 的 Spec 上是這樣講的[參考1]:
就是說開機之后,CPU 實際上是處在保護模式下的,Base=FFFF0000h 加上 EIP 就剛好是 4G 下面一點點。
我做了一點試驗來驗證上面的,但是還不完全。
試驗環(huán)境:MSI 7365 主板
NB: BearLake
SB: ICH9
SPI: 1MB(板載1MB但是我們有特殊設備,可以直接使用2MB)
此外,還有一塊強大的Debug卡,它有8個數(shù)碼管,能夠顯示發(fā)送到Port 300h上的32位數(shù)據(jù)。
Step1. 生成一個2MB的文件:我選用 WinHex
選擇生成2MB的
命名為our.bin
新生成的文件是全0填充的,我再使用 UltraEdit-32 打開,替換
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
為
"90 90 90 90 90 90 90 90 90 90 90 90 90 90 eb e0"
其中的 90是 NOP 指令,EB E0 是跳轉(zhuǎn)指令,意思是跳轉(zhuǎn)到上面 16 個字節(jié)處。
比如:
1FFFF0h 后面的 EB E0 就會跳轉(zhuǎn)到 1FFFE0h 處繼續(xù)執(zhí)行。
這樣,整個文件都成為一個可以執(zhí)行的程序"鏈條",我們要做的只是用我們的代碼的機器碼取代 90h 就可以了。
我在文件的末端寫入
2E668B06F0FF mov eax,cs:[0fff0]
BA0003 mov dx,300h ;(我在PCI上插了一個能截獲丟到300h端口的Debug卡)
66ef out dx,eax
ebfe jmp $
運行之后,我們的卡上會出現(xiàn)068B662E ,這里我們無法使用 mov eax,[esi]
這樣的指令,因為ds es似乎還沒有處于保護模式下,使用的結(jié)果只有死機。
開機之后,沒有Ram可以使用,因此暫時沒有辦法將EIP裝到EAX中并且顯示出來。
(本文涉及內(nèi)容請不要隨便試驗,因為在沒有刷新設備的情況下進行BIOS更新會導致無法開機)
參考1:
Intel? 64 and IA-32 Architectures
Software Developer's Manual
Volume 3A:
System Programming Guide, Part 1
Order Number: 253668-024US
August 2007
第 382 頁 為了方便參考閱讀,我將相關(guān)內(nèi)容抓圖放在下面。
收稿日期:2007年10月1日
--------------------------------------------------------------------------------
<<<上一篇 歡迎訪問AoGo匯編小站:http://www.aogosoft.com 下一篇>>>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -