最近幾天在看《 unix 作業系統設計》突然想到計算機是如何啟動的呢?那就得從 bios 說起,其實這個冬冬早已是 n 多人寫過的了,今天就以自己的理解來寫寫,權當乙個學習筆記。
一、 預備知識:
很多人將 bios 與 cmos 混為一談,在開始介紹 bios 工作原理以前先來簡單的了解以下 bios 、 cmos :
什麼是 bios
系統開機啟動 bios ,即微機的基本輸入輸出系統 (basic input-output system) ,是整合在主機板上的乙個 rom 晶元,其中儲存有微機系統最重要的基本輸入 / 輸出程式、系統資訊設定、開機上電自檢程式和系統啟動自舉程式。
整合在 bios 上得程式主要有如下幾個:
bios 中斷例程:即 bios 中斷服務程式。它是微機系統軟、硬體之間的乙個可程式設計介面,用於程式軟體功能與微機硬體實現的衍接。 dos/windows 作業系統對軟、硬碟、光碟機與鍵盤、顯示器等外圍裝置的管理即建立在系統 bios 的基礎上。程式設計師也可以通過 對 int 5 、 int 13 等中斷的訪問直接呼叫 bios 中斷例程。
bios 系統設定程式:微機部件配置情況是放在一塊可讀寫的 cmos ram 晶元中的,它儲存著系統 cpu 、軟硬碟驅動器、顯示器、鍵盤等部件的資訊。 關機後,系統通過一塊後備電池向 cmos 供電以保持其中的資訊。如果 cmos 中關於微機的配置資訊不正確,會導致系統效能降低、零部件不能識別,並由此引發一系統的軟硬體故障。在 bios rom 晶元中裝有乙個程式稱為 「 系統設定程式 」 ,就是用來設定 cmos ram 中的引數的。這個程式一般在開機時按下乙個或一組鍵即可進入(一般為 delete鍵),它提供了良好的介面供使用者使用。這個設定 cmos 引數的過程,習慣上也稱為「bios 設定 」 。新購的微機或新增了部件的系統,都需進行 bios 設定。
post 上電自檢微機接通電源後,系統將有乙個對內部各個裝置進行檢查的過程,這是由乙個通常稱之為 post(power on self test, 上電自檢 ) 的程式來完成的。這也是 bios 的乙個功能。完整的 post 自檢將包括 cpu 、 640k 基本記憶體、 1m 以上的擴充套件記憶體、 rom 、主機板、 cmos 存貯器、串並口、顯示卡、軟硬盤子系統及鍵盤測試。自檢中若發現問題,系統將給出提示資訊或鳴笛警告。
bios 系統啟動自舉程式在完成 post 自檢後, rom bios 將按照系統 cmos 設定中的啟動順序搜尋軟硬碟驅動器及 cdrom 、網路伺服器等有效的啟動驅動器 ,讀入作業系統引導記錄,然後將系統控制權交給引導記錄,由引導記錄完成系統的啟動。
什麼是 cmos
cmos (本意是指互補金屬氧化物半導體 —— 一種大規模應用於積體電路晶元製造的原料)是微機主機板上的一塊可讀寫的 ram 晶元,用來儲存當前系統的硬體配置和使用者對某些引數的設定。 cmos 可由主機板的電池供電,即使系統掉電,資訊也不會丟失。 cmos ram 本身只是一塊儲存器,只有資料儲存功能,而對 cmos 中各項引數的設定要通過專門的程式。早期的 cmos 設定程式駐留在軟盤上的 ( 如 ibm 的 pc/at機型 ) ,使用很不方便。現在多數廠家將 cmos 設定程式做到了 bios 晶元中,在開機時通過特定的按鍵 就可進入 cmos 設定程式方便地對系統進行設定,因此 cmos 設定又被叫做 bios 設定。 早期的 cmos 是一塊單獨的晶元 mc146818a(dip 封裝 ) ,共有64 個位元組存放系統資訊 , 見 cmos 配置資料表。 386 以後的微機一般將 mc146818a晶元整合到其它的 ic 晶元中 ( 如 82c 206 , pqfp 封裝 ) ,最新的一些 586 主機板上更是將 cmos 與系統實時時鐘和後備電池整合到一塊叫做 dallda ds1287 的晶元中。隨著微機的發展、可設定引數的增多,現在的 cmos ram 一般都有 128 位元組及至 256 位元組的容量。為保持相容性,各 bios 廠商都將自己的 bios 中關於 cmos ram 的前 64位元組內容的設定統一與 mc146818a 的 cmos ram 格式一致,而在擴充套件出來的部分加入自己的特殊設定,所以不同廠家的 bios 晶元一般不能互換,即使是能互換的,互換後也要對 cmos 資訊重新設定以確保系統正常執行。
二、工作原理介紹
下面從計算機加電開始,看 bios 是如何一步一步工作的:
1、 加電
計算機電源開始工作,當電源的輸入電壓穩定以後,主機板的 timer 被觸發,它產生乙個復位脈衝送給 80x86cpu 讓 cpu 開始工作,當 cpu 收到該復位脈衝後,其硬體邏輯就會置 cs 暫存器為 ffffh , ip 暫存器為 0000h ,也就是說,會自動地到ffff:0000h 去取第一條指令,(在對記憶體編址的時候,高位址部分總是編給一些
rom,在這些
rom裡是預先寫好的程式或資料,位址
ffff
:0000h
其實就是在
rom裡。以前不懂這個規則的時候著實被搞糊塗了,不明白
ffff
:0000h
裡的跳轉指令是**來的,其實就是寫死在
rom裡的了,就這麼簡單。) 這個地方只有一條jmp 指令,告訴處理器到什麼地方讀取 bios rom 。
2 、 post
post 其實是一系列的執行不同初始化和計算機硬體檢測的函式或例程。 bios 以對主機板硬體的一系列檢測開始,包括檢測: cpu ,數學協處理器、時鐘 ic , dma 控制器和中斷請求( irq )控制器,檢測的順序根據主機板的不同而不同。
然後 bios 以 2k 的增量掃瞄 c800:000h 到 df800:000h 直接的位址,以檢測計算機中可能裝的其他 rom ,比如網絡卡、 scsi 介面卡等,如果找到乙個裝置的 rom ,則對該裝置的 rom 中的內容做校驗和,如果檢測通過則將控制權轉交給裝置 bios 讓其對裝置進行初始化,初始化結束後 bios 再收回控制權,如果校驗和檢測失敗,將再螢幕上顯示:「 *** rom error 」,其中 *** 是檢測到該 rom 的位址的斷位址。
然後, bios 開始檢測位址為 0000:0472h 的記憶體,該處存放這乙個標識系統是通過冷啟動啟動還是通過熱啟動啟動的標誌,如果為 1234h 則代表熱啟動(該數值是一little endian 的格式儲存的,因此在記憶體中的應為 3412 ), bios 將直接跳過剩餘的post 例程。如果是冷啟動, bios 將繼續執行剩餘的 post 例程,在此過程中, bios將乙個 16 進製的編碼寫到埠 80h (不同的計算機埠號會不同),這個 16 進製編碼指示在何時檢測什麼。
3 、引導作業系統
post 結束之後, bios 會尋找乙個作業系統。通常, bios 會試圖在軟碟機中尋找dos 系統的引導盤,如果找不到,它會試圖在 c 盤尋找作業系統。如果軟碟機中有引導盤, bios 將 1 扇區 0 磁頭 0 柱面的內容(引導記錄)載入記憶體 0000 : 7c 00h 開始的地方。如果軟盤中沒有 dos 引導盤,則 bios 搜尋硬碟尋找硬碟的第乙個扇區,然後把主引導記錄( mbr )載入記憶體 0000 : 7c 00h 開始的地方。 一旦引導記錄載入完畢, bios 就交出系統的執行控制權,跳轉到引導程式的頭部執行。下面就是硬碟的mbr **流程,其中的引導扇區是指硬碟相應分割槽的第乙個扇區,是和作業系統有關的作業系統的引導是由它來完成的,而 mbr (硬碟的第乙個扇區)並不負責, mbr和作業系統無關他的任務是把控制權轉交給作業系統的引導程式 。
程式流程:
1 將程式**由 0000:7c00h 移動到 0000:0600h (注, bios 把 mbr 放在0000:7c00h 處)
2 搜尋可引導分割槽,即 80h 標誌
成功: goto 3
失敗:跳入 rom basic
無效分割槽表: goto 5
3 讀引導扇區 ( 注:用於作業系統的引導,將它讀到 0000 : 7c 00h)
失敗: goto 5
成功: goto 4
4 驗證引導扇區最後是否為 55aah
失敗: goto 5
成功: goto 6
5 列印錯誤進入無窮迴圈
6 跳到 0:7c00h 進行下一步啟動工作
BIOS啟動原理BIOS啟動原理
intel的ibm pc上i386晶元是遵循intel與ibm共同制定的boot協議的 1.pc機的復位線和系統中的所有部件相連,包括cpu的reset引腳 2.系統上電開機時,主機板電源系統傳送低電平的 power good 訊號,該訊號送到復位介面電路的 res端,產生時鐘同步的復位正脈衝訊號r...
BIOS如何工作
當計算機主機通電後,bios首先做的工作時進行加電自檢post power on self test 整個過程如下圖所示,但是通常只花費1 2秒鐘時間就完成,所以一般人往往會忽略這個過程。dma direct memory access,翻譯為直接記憶體訪問,是一種讓裝置不經過處理器直接讀寫記憶體的...
BIOS是如何工作的
啟動bios 按下電源後,裝置加電,cpu會進入實模式執行,並強制設定cs和ip暫存器的值 cs 0xffff ip 0x0000或者cs 0xf000 ip 0xfff0,沒有進行驗證 則cs ip的實體地址即為0xffff0 這個位址即為bios的入口位址,則加電後cpu會去預設執行改位址儲存的...