CPU加電後第一條指令

2021-08-16 17:36:48 字數 2404 閱讀 4563

當我們按下電源開關時,電源就開始向主機板和其它裝置供電,此時電壓還不太穩定,主機板上的控制晶元組會向cpu發出並保持乙個reset(重置)訊號,讓 cpu內部自動恢復到初始狀態,但cpu在此刻不會馬上執行指令。當晶元組檢測到電源已經開始穩定供電了(當然從不穩定到穩定的過程只是一瞬間的事情),它便撤去reset訊號(如果是手工按下計算機面板上的reset按鈕來重啟機器,那麼鬆開該按鈕時晶元組就會撤去reset訊號),cpu馬上開始執行第一條指令。下面我們來討論一下有關第一條指令。

我們知道,計算機剛加電的時候ram(記憶體條)裡面是沒有內容的,所以第一條指令當然是在rom(固化在主機板上)裡,剛開機記憶體中什麼都沒有。

那既然ram中是空的,我們怎麼去執行rom中的**呢,靠的是位址對映。硬體會把eprom對映在兩個地方,乙個是從0xffffffff(4gb)處向下擴充套件,乙個是從0xfffff(1mb)處向下擴充套件。

注:另外位址對映是佔據位址空間,所以縱使你的pc機只有2g記憶體也沒事,因為並沒用記憶體,使用的只是位址空間,只是把那塊位址分配給了eprom。

既然硬體將rom中的內容對映到了記憶體上,那麼cpu就可以通過位址來訪問rom中的內容。那第一條指令的位址是什麼呢?有兩種解釋:0xfffffff0h,0xffff0h。intel的手冊上如是說:

也就是0xfffffff0h是對的,它是實體地址空間的最高16位元組。

有關第二種,0ffff0h這種說法其實在早期intel 8088,8086 處理器的16位時代,位址空間為1m,實體地址空間的最高16位元組就是從0xffff0h開始的,即第一條指令的位址就是0xffff0h。現在已經不使用了,但是為了保持相容性,這兩個地方的內容還是一樣的,因為上文提到的位址對映。硬體會把eprom對映在兩個地方,乙個是從0xffffffff(4gb)處向下擴充套件,乙個是從0xfffff(1mb)處向下擴充套件。在單步跟蹤除錯bios時證實兩個內容確實時一樣的。

還有,按照16位模式下的實體地址和邏輯位址的轉換方式。實體地址=(cs*16)+ip,即cs暫存器的值左移4位,加上ip的值,這麼算下來,的確也是0xffff0h。因為加電後暫存器的初值為:

但是,剛開始的時候並不是這種計算方式,雖然在16位實模式,但是intel規定是當cs中的初始值被改變後才使用這種一般的位址計算方式。未改變之前用base+eip來生成位址,所以還是0xfffffff0。

第一條指令的內容是一條長跳轉指令:0xfffffff0:  ljmp   $0xf000,$0xe05b。第一條指令位址=cs中不可見部分的baseaddress+eip=ffffffff0,從fffffff0-ffffffff的十六個位元組分配為rom位址,然後執行rom裡面的第一條far jmp指令,此時cs被修改(雖然值未變仍然是f000,但不可見部分的baseadress變了,000f0000),此時得到第二條指令的位址000fe05b,位於1m以下。這樣cpu就可以繼續執行bios中的**。那麼bios存在於什麼位置?

我們先來看看記憶體的記憶體的分配:

我們可能經常聽到一些只有在pc機上才有的一些關於儲存器的專有名詞,包括:常規記憶體(conventional memory)、上位記憶體區(upper memory area)、高階記憶體區(high memory area)和擴充套件記憶體(extended memory),我盡量把這幾個東東說明白,這需要下面這張著名的圖。

這張圖很清楚地說明了問題,大家都知道,dos下的「常規記憶體」只有640k,這640k就是從0--a0000h這段位址空間;所謂「上位記憶體區」,指的就是20位位址線所能定址到的1m位址空間的上面384k空間,就是從a0001h--100000h這段位址空間,也就是我們說的用於rom和系統裝置的位址區域,這384k空間和常規記憶體的640k空間加起來就是20位位址線所能定址的完整空間1024kb;由於80286和80386的出現使pc機的位址線從20位變成24位又變成32位,定址能力極大地增加,1m以上的記憶體定址空間,我們統稱為「擴充套件記憶體」;這裡面絕大部分記憶體區域只能在保護模式下才能定址到,但有一部分既可以在保護模式下,也可以在實模式下定址,這就是我們前面提到過的位址100000h--10ffefh之間的這塊記憶體,(也就是在16實模式的位址轉換機制下能表示但是已經超過實際的1m空間的那段位址)為了表明其特殊性,我們把這塊有趣的記憶體區叫做「高階記憶體」。

注:本文為我通過查閱網上資料以及參考intel開發手冊得出的結論,如有疑問或錯誤,歡迎討論指正。

前兩天發現一篇解釋的不錯的文章:基於intel 80×86 cpu的ibm pc及其相容計算機的啟動流程-部落格-雲棲社群-阿里雲

計算機加電後執行的第一條指令

第一步 當我們按下電源開關時,電源就開始向主機板和其它裝置供電,此時電壓還不太穩定,主機板上的控制晶元組會向cpu發出並保持乙個reset 重置 訊號,讓cpu內部自動恢復到初始狀態,但cpu在此刻不會馬上執行指令。當晶元組檢測到電源已經開始穩定供電了 當然從不穩定到穩定的過程只是一瞬間的事情 它便...

cpu執行第一條指令時情形

執行的第一條指令不在記憶體中,眾所周知,記憶體是由 組成的 而 不斷電,可以儲存資訊,一旦斷電,中的資訊將會丟失,所以 要執行的第一條指令被固化在 中 以前 年代,由於記憶體是 的,所以 被編址在 的最後的 中,所以它的段位址是0xffff0,這樣就不至於不 分成兩個部分,就是將 設定成0xf000...

第一條部落格

第一條部落格 csdn的這個markdown看起來好高大上啊,但是看不懂啊.本部落格是記錄dsp相關數字電源部分的學習的,這是我的第一條csdn部落格,第一次接觸csdn是在初中的時候到現在大學畢業工作第一年已有十年有餘。大學四年在遊戲中虛度,大三下學期開始接觸開關電源,本身學校普通不能再普通的本科...