1. 程式人生 > >CPU加電後第一條指令

CPU加電後第一條指令

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

1.第一條指令在哪?

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

那既然RAM中是空的,我們怎麼去執行ROM中的程式碼呢,靠的是地址對映。硬體會把EPROM對映在兩個地方,一個是從0xFFFFFFFF(4GB)處向下擴充套件,一個是從0xFFFFF(1MB)處向下擴充套件。

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

2.第一條指令的地址是什麼?

既然硬體將ROM中的內容對映到了記憶體上,那麼CPU就可以通過地址來訪問ROM中的內容。那第一條指令的地址是什麼呢?有兩種解釋:0xFFFFFFF0H0xFFFF0H。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

。因為加電後暫存器的初值為:


(CS*16)+EIP=(0xF000H*16)+0xFFF0H=0xFFFF0H。

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

3.第一條指令的內容是什麼?

第一條指令的內容是一條長跳轉指令: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空間的那段地址)為了表明其特殊性,我們把這塊有趣的記憶體區叫做“高階記憶體”。

PC機的設計師將1MB中的低端640KB用作RAM,供DOS及應用程式使用;高階的384KB則保留給ROM、視訊適配卡等系統使用。從此,這個界限便被確定了下來並且沿用至今。低端的640KB就被稱為常規記憶體即PC機的基本RAM區。保留記憶體中的低128KB是顯示緩衝區,高64KB是系統 BIOS(基本輸入/輸出系統)空間,其餘192KB空間留用

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

相關推薦

CPU第一指令

當我們按下電源開關時,電源就開始向主機板和其它裝置供電,此時電壓還不太穩定,主機板上的控制晶片組會向CPU發出並保持一個RESET(重置)訊號,讓 CPU內部自動恢復到初始狀態,但CPU在此刻不會馬上

linux系統啟動過程具體解釋-開機發生了什麽 --linux內核剖析(零)

界面 種類 system pos 放置 nlog 提示 mar .com 本文參考了例如以下文章 深入理解linux啟動過程 mbr (主引導記錄(Master Boot Record)) 電腦從開機加電到操作系統main函數之前執行的過程

cpu怎麼知道(判斷)一指令有多少個位元組?

指令譯碼一般有幾個過程(部件):指令預取、指令預分析(預解碼)、解碼。預取是從cache或者記憶體取一系列的位元組(大小可以保證至少包含一條指令),並設定一個待分析的位置,預分析從此位置逐位元組分析,如果是字首就設定分析狀態(因為字首可能改變預設地址尺寸和運算元的大小,影響後續指令長度),直

計算機作業系統啟動過程

揭開鋼琴的蓋子:作業系統好比一個架美麗的鋼琴,我們可以用上面的琴鍵彈出優美的旋律。但是我們不能滿足於只會彈奏,如果我們要更深入理解鋼琴,必須開啟鋼琴的蓋子,一探究竟。所以學習作業系統,不能停留上系統API的呼叫,需要能更好更高效的呼叫API,知道API的侷限性與缺點,就必須開啟作業系統的蓋子,探究作業系統AP

除錯kernel時對bios過程的一些心得

 1. 加電後cpu 的 狀態是: eax:0×00000000, ebx:0×00000000, ecx:0×00000000, edx:0×00000543 ebp:0×00000000, esp:0×00000000, esi:0×00000000, edi:0×00000000 eip:0x0000

小程序載數據滾動載到底部

返回 bsp .exe 一個 lan pan esc class () 1 wx.createSelectorQuery().select(‘#body‘).boundingClientRect(function (rect) { 2 // 使頁

sqlite 分組獲取每組的第一記錄

有表如下 CREATE TABLE test ( id INTEGER PRIMARY KEY ,groupid INTEGER DEFAULT 0 ,t INTEGER DEFAULT 0 ,x INTEGER DEFAULT 0 ,y INTEGER DEFAULT 0

指令cpu中的執行流程(理解CPU組成)

幾乎所有的馮·諾伊曼型計算機的CPU,其工作都可以分為5個階段:取指令、指令譯碼、執行指令、訪存取數、結果寫回。 1.取指令階段 取指令(Instruction Fetch,IF)階段是將一條指令從主存中取到指令暫存器的過程。 程式計數器PC中的數值,用來指示當前指令在主存中的位置。當一條指令被取出後,PC

mysql排序第一資料

<span style="font-size:18px;">select * from user order by create_time desc</span> 想取得這個

left join ,查詢結果集排序第一資料

最近改一個問題,改sql語句,大概意思是 左關聯 A 表 和 B表,  按照條件查詢後對查詢結果排序後結果集的第一條資料。 原始的SQL: select a.id from A a  left join B b on  a.id = b. id  where   a.use

oracle排序獲取第一資料

首先想說下,其實很簡單的 select * from (select * from testStudent order by id desc) where rownum=1; 看上面的sql語句 先執行括號裡面的  查詢出所有學生,並進行降序排序,在執行外面的 rown

ExtJS用Grid顯示資料如何自動選取第一記錄

       用Grid顯示資料後,如何讓系統自動選取第一條記錄呢?在顯示Grid時由於其Store正在loading,沒法在Grid選取第一條記錄,因為還沒有記錄,所以應在其Store進行操作。 檢

指令cpu中的執行流程

幾乎所有的馮·諾伊曼型計算機的CPU,其工作都可以分為5個階段:取指令、指令譯碼、執行指令、訪存取數、結果寫回。 1.取指令階段 取指令(Instruction Fetch,IF)階段是將一條指令從主存中取到指令暫存器的過程。 程式計數器PC中的數值,用來指示當前指令在主存中的位置。當一條指令被取出

資訊保安課程設計第一週任務(7指令的分析)

資訊保安課程設計第一週任務(7條指令的分析) 概述:本篇部落格主要為大家介紹openssl的7條指令的具體功能和實現。 7條指令如下: dsaparam dsa enc md_gost94 bf-ecb bf-ofb camellia-128-c

【筆記】canvas圖片預載及進度的實現

函數 style uil 圖片加載 mage code 重繪 執行 ces /*star *loading模塊 *實現圖片的預加載,並顯示進度條 *參數:圖片數組對象,加載完成的回調函數 */ function loadImages(sources,c

Eclipse使用添tomcat,默認部署目錄不是tomcat/webapps,修改方法如下

菜單 添加 服務器 方法 pen app eclips out eba Eclipse配置tomcat默認是發布到.metadata\plugins\目錄下的,wtpwebapps。 這樣在實際的tomcat目錄下,就找不到發布的項目。那麽我們要怎麽設置呢? 在控制

css 層透明度文字依然清晰

clas blog code important 背景透明 cit span round color background: rgba(0, 0, 0, 0.5) none repeat scroll 0 0 !important; /*實現FF背景透明,文字不透明*/

從開機到執行main函數之前的過程

分享 鏈接 cmp 頁表 root 重要 pri 計算 頁面 1.啟動BIOS,準備實模式下中斷向量表和中斷服務程序 在按下電源按鈕的瞬間,CPU硬件邏輯強制將CS:IP設置為0xFFFF:0x0000,指向內存地址的0xFFFF0位置,此位置屬於BIOS的地址範圍。關於

Vue-上拉載與下拉刷新(mint-ui:loadmore)一個頁面使用多個上拉沖突問題

tps loaded 讓其 ade disabled 元素 info 鏈接 加載 所遇問題: 該頁面為雙選項卡聯動,四個部分都需要上拉加載和下拉刷新功能,使用的mint-ui的loadmore插件,分別加上上拉加載後,只有最後一個的this.$refs.loadmore.o

zTree異步載展開第一級節點

func false nodes 展開 加載 des color setting pan 在 setting 中的 callback 中加上 onAsyncSuccess:onAsyncSuccess 回調函數 , 然後實現回調函數 var isFirst =