電腦CPU開機上電后的第一條指令


    結合上面的文章,CPU上電后第一條指令是通過CS:IP來指定的,CPU廠家會給其初始值,對於386處理器來說,CPU第一條指令地址是

                  0xFFFFFFF0

  這里會有一個問題,CPU怎么能一上來就去0xFFFFFFF0取指令呢?因為此時的內存都沒有初始化呢,內存中什么都沒有,第一條指令毫無疑問肯定在BIOS中,現在用來燒寫BIOS的Flash芯片一般也就256KB、1MB、4MB,都是非常小的,怎么也沒有0xFFFFFFF0這個地址的。

  這里就需要說一下x86的地址編碼方式了,我們平時說的內存,主存是指RAM,但是這里會有些問題,因為RAM是從0開始的一個地址范圍,而ROM也是從0開始的一個地址范圍,當我們要訪問一個地址,比如0x100,此時到底是去RAM里找還是去ROM里找呢?

  x86解決這個問題的方法是“統一編碼”,也可以叫做地址映射,也就是在CPU眼里,它只看到一塊打的空間,對於32位CPU,從0開始,4G結束,64位的CPU最大范圍就更大了,CPU才不懂什么叫RAM,什么叫ROM,什么叫硬盤的,地址映射的概念就是給地址分段,不同位置是有不同的作用的,大部分是用來給程序運行的RAM的,但還有部分是映射給ROM,IO或者其他設備,下圖是一種典型的地址映射關系:

  

  那么問題又來了,上面不是說CPU上電后會去0xFFFFFFF0處取第一條指令,這條指令肯定是在BIOS中,但是上圖中BIOS的映射地址時0xF0000,這個就有點懵了,到底是為什么呢?那么BIOS代碼到底映射在什么位置呢?

  答案是--兩個地址都有,BIOS的代碼肯定是存在EPROM中的,CPU中的硬件回把EPROM芯片映射到2個地方,一個是從0xFFFFFFFF(4G)處向下擴展,一個是從0xFFFFF(1MB)處向下擴展,第一個映射是因為第一條指令在0xFFFFFFF0處,所以EPROM必須在哪個位置,第二個映射是為了兼容,在16位時代就有了,另外地址映射是占據地址空間,總是你的PC機只有2G內存也沒關系,因為病沒有使用內存,使用的只是地址空間,所到底對於CPU來說,它才不知道哪是哪,它只知道服從硬件安排,上面的所有所有地址映射,都是給程序員看的,不是給CPU看的,CPU只認各種“門”電路。

  那么第一條指令的內容是什么呢?

  這是比較容易產生混淆的地方,多數人說第一條指令是個長跳轉(long jmp),跳轉到0~0xFFFFF(0-1MB)這一段,然后再執行BIOS剩余的指令,但是intel手冊中卻又這么一段話:

  

   簡單的說,就是不讓有長跳轉動作,其實這兩種都對,intel手冊上說的是讓BIOS在高地址空間運行,器件一直修改CS寄存器,也就是一直使用Base+EIP的方式生成地址,這種新式方法應該是UEFI的,那種剛開始就長跳轉的屬於老式做法。

  假設有一塊1M的flash芯片,第一條指令一般都是在0xFFFF0的這個位置,這樣的原因,我們可以很簡單的想到,這是為了把這1M空間方便的映射到4G地址中最高的1M中吧,可能看起來比較對齊吧。

  BIOS也就是ROM的地址空間通過CPU的硬件自動映射到了高地址1M,但是我們平時看到的都是低於1M的BIOS,因為在高地址的時候,CPU實際上是在訪問ROM,這段時間內,基本的操作就是硬件初始化,最重要的肯定是RAM等重要硬件的初始化,初始化完成后,CPU根據BIOS中的“搬家”代碼,回將ROM的所有內容拷貝到RAM中(整體拷貝比較方便,如果是想着把前面執行過的剔除掉,得不償失),當然這個位置肯定就是低1M的地址空間,比如上圖中,從0xF0000開始的那64Kb空間(放心,一般的BIOS不會超過64KB),拷貝完成后,CPU會執行一條長跳轉,這會引起CS寄存器的改變,也就會控制CPU指向RAM進行執行程序了,這樣帶來2個好處,第一肯定是RAM比ROM更快,第二是這樣重新滿足了實模式下尋址范圍是1M的這一特點,當然CPU尋址方式回重新回歸到CS左移4位+IP的模式。

  到這里還有一些疑問:我們一般會認為第一條紫菱本身就是一條長跳轉指令,那么CPU是怎么完成內存初始化后,並將BIOS相關數據拷貝到1M以下地址空間呢?這里有幾種可能(方便說服內心的猜測),第一是這條指令並不是真正的長跳轉,而是先進行一些基本的初始化,才跳轉,第二是ROM到地址空間的映射並不是簡單的映射到搞地質的1M,而是有着更復雜的映射方式,使得長跳轉后時間上CPU還是在訪問ROM,第三就是CPU一旦上電,就自動的由硬件將BIOS內容復制到對應的RAM中,這一點在ARM9的工作模式可以驗證。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM