by lightseed
2009-10-26
其實早就想寫這樣一篇文章了,今天才著手寫了下。說來也慚愧關於cpu的第一條指令的問題,在一開始study的時候我自己並沒有求甚解,所以當時理解的也比較膚淺,今天我們來詳細**一下關於reset(從沒電到上電)後cpu執行第一條指令的一些東西。(說明一下:這篇文章是討論的ia32架構上的處理器。)
如果您還對flat mode的原理還不太了解的話,那麼我想你可以再回頭參考一下關於flat mode的原理。見
在保護模式下,我們的段暫存器其實都是由兩部分組成的:一步分是可見的段選擇子(segment selector),另外一部分是隱藏的基位址(base address)。那麼第一條指令就和這個密切相關。
開門見山,當hw reset後,cpu會到(實體地址為)0ffff fff0h處去取指令並執行之。這個位址很明顯是cpu的最高實體地址往下數16個bytes的位址處。bios的第一條指令必須要被放到這裡,否則的話。。。後果可想而知。
我想只要是剛入門的freshman都會感到比較疑惑,這個位址(ffff fff0h)明明是大於1-mbyte的位址了,而此時的cpu卻是在實模式下的,那麼cpu是怎麼到這裡去取指令的呢?
不過看完上面這段話的描述,我們是不是感覺有點親切呢?再回憶一下,其實在我們之前的討論中關於flat mode的時候,就接觸到個概念了。在flat mode中的時候,雖然我們是處於實模式,但是由於我們的段暫存器(segment register)是由兩個部分組成的,一部分是可見的段選擇子,另外一部分是隱藏部分(段基位址)。如果我們在protect mode中修改好了段暫存器的段基位址部分,然後返回實模式,那麼只要不顯示地修改段暫存器,cpu在定址的時候仍然會照protect mode下的定址方式來計算位址,即:segment selector:offset。
經過正確的power sequence後,cpu吃到cpurst#正常bist(built-in self-test)後,cpu其實就正是處於flat mode中。(比較特殊的實模式)那麼讓我們來看看正常的bist後,cpu的(部分)暫存器的狀態吧。見圖1。
圖1 bist後部分暫存器的值
圖2 cpu關於cr0的bit定義
看清楚了圖2中定義的cr0的bit0了麼?pe,是指protect mode enable。那麼我們再結合圖1兩個方框處關於cr0和cs的初始值,可以很清楚地看到這個時候cpu是處於實模式的,然而cs的base卻是等於ffff0000h的,而且段界限是ffffh,並且cs的選擇子是等於f000h的。
那這樣以來,如果我們用cs:ip是用f000h:fff0h的方式來操作的時候,cpu其實是會把位址這樣算的。f000h是cs的段選擇子,從這裡取出cs的基位址(就是ffff0000h)再加上ip的值(fff0h)就等於實際要訪問的記憶體位址(正好是ffff fff0h)[ffff0000+fff0h=fffffff0h]。所以在32bit的cpu上,這個第一條指令的計算是這樣來的。
不過一般情況下hw reset後,bios都會在第一條指令這裡安排乙個far jump來顯示地修改cs的值,目的就是能夠讓cs真正進入real mode。就是讓cs能夠遵從正常的real mode的定址翻譯規則。(cs base address = cs segment selector * 16)。那至於後面的bios code的run的環境,我想大家就都應該了解了。
第一條部落格
第一條部落格 csdn的這個markdown看起來好高大上啊,但是看不懂啊.本部落格是記錄dsp相關數字電源部分的學習的,這是我的第一條csdn部落格,第一次接觸csdn是在初中的時候到現在大學畢業工作第一年已有十年有餘。大學四年在遊戲中虛度,大三下學期開始接觸開關電源,本身學校普通不能再普通的本科...
cpu執行第一條指令時情形
執行的第一條指令不在記憶體中,眾所周知,記憶體是由 組成的 而 不斷電,可以儲存資訊,一旦斷電,中的資訊將會丟失,所以 要執行的第一條指令被固化在 中 以前 年代,由於記憶體是 的,所以 被編址在 的最後的 中,所以它的段位址是0xffff0,這樣就不至於不 分成兩個部分,就是將 設定成0xf000...
CPU加電後第一條指令
當我們按下電源開關時,電源就開始向主機板和其它裝置供電,此時電壓還不太穩定,主機板上的控制晶元組會向cpu發出並保持乙個reset 重置 訊號,讓 cpu內部自動恢復到初始狀態,但cpu在此刻不會馬上執行指令。當晶元組檢測到電源已經開始穩定供電了 當然從不穩定到穩定的過程只是一瞬間的事情 它便撤去r...