BIOS 工作原理
最近幾天在看《?UNIX?操作系統(tǒng)設(shè)計(jì)》突然想到計(jì)算機(jī)是如何啟動(dòng)的呢?那就得從?BIOS?說(shuō)起,其實(shí)這個(gè)冬冬早已是?n?多人寫過(guò)的了,今天就以自己的理解來(lái)寫寫,權(quán)當(dāng)一個(gè)學(xué)習(xí)筆記。
一、????????預(yù)備知識(shí):
很多人將?BIOS?與?CMOS?混為一談,在開始介紹?BIOS?工作原理以前先來(lái)簡(jiǎn)單的了解以下?BIOS?、?CMOS?:
?
什么是?BIOS
?
系統(tǒng)開機(jī)啟動(dòng)?BIOS?,即微機(jī)的基本輸入輸出系統(tǒng)?(Basic Input-Output System)?,是集成在主板上的一個(gè)?ROM?芯片,其中保存有微機(jī)系統(tǒng)最重要的基本輸入?/?輸出程序、系統(tǒng)信息設(shè)置、開機(jī)上電自檢程序和系統(tǒng)啟動(dòng)自舉程序。
集成在?BIOS?上得程序主要有如下幾個(gè):
BIOS?中斷例程:?即?BIOS?中斷服務(wù)程序。它是微機(jī)系統(tǒng)軟、硬件之間的一個(gè)可編程接口,用于程序軟件功能與微機(jī)硬件實(shí)現(xiàn)的衍接。?DOS/Windows?操作系統(tǒng)對(duì)軟、硬盤、光驅(qū)與鍵盤、顯示器等外圍設(shè)備的管理即建立在系統(tǒng)?BIOS?的基礎(chǔ)上。程序員也可以通過(guò)?對(duì)?INT 5?、?INT 13?等中斷的訪問(wèn)直接調(diào)用?BIOS?中斷例程。
BIOS?系統(tǒng)設(shè)置程序:?微機(jī)部件配置情況是放在一塊可讀寫的?CMOS RAM?芯片中的,它保存著系統(tǒng)?CPU?、軟硬盤驅(qū)動(dòng)器、顯示器、鍵盤等部件的信息。?關(guān)機(jī)后,系統(tǒng)通過(guò)一塊后備電池向?CMOS?供電以保持其中的信息。如果?CMOS?中關(guān)于微機(jī)的配置信息不正確,會(huì)導(dǎo)致系統(tǒng)性能降低、零部件不能識(shí)別,并由此引發(fā)一系統(tǒng)的軟硬件故障。在?BIOS ROM?芯片中裝有一個(gè)程序稱為?“?系統(tǒng)設(shè)置程序?”?,就是用來(lái)設(shè)置CMOS RAM?中的參數(shù)的。這個(gè)程序一般在開機(jī)時(shí)按下一個(gè)或一組鍵即可進(jìn)入(一般為?Delete?鍵),它提供了良好的界面供用戶使用。這個(gè)設(shè)置?CMOS?參數(shù)的過(guò)程,習(xí)慣上也稱為?“BIOS?設(shè)置?”?。新購(gòu)的微機(jī)或新增了部件的系統(tǒng),都需進(jìn)行?BIOS?設(shè)置。
POST?上電自檢?微機(jī)接通電源后,系統(tǒng)將有一個(gè)對(duì)內(nèi)部各個(gè)設(shè)備進(jìn)行檢查的過(guò)程,這是由一個(gè)通常稱之為?POST(Power On Self Test,?上電自檢?)?的程序來(lái)完成的。這也是?BIOS?的一個(gè)功能。完整的?POST?自檢將包括?CPU?、?640K?基本內(nèi)存、?1M?以上的擴(kuò)展內(nèi)存、?ROM?、主板、?CMOS?存貯器、串并口、顯示卡、軟硬盤子系統(tǒng)及鍵盤測(cè)試。自檢中若發(fā)現(xiàn)問(wèn)題,系統(tǒng)將給出提示信息或鳴笛警告。
BIOS?系統(tǒng)啟動(dòng)自舉程序?在完成?POST?自檢后,?ROM BIOS?將按照系統(tǒng)?CMOS設(shè)置中的啟動(dòng)順序搜尋軟硬盤驅(qū)動(dòng)器及?CDROM?、網(wǎng)絡(luò)服務(wù)器等有效的啟動(dòng)驅(qū)動(dòng)器,讀入操作系統(tǒng)引導(dǎo)記錄,然后將系統(tǒng)控制權(quán)交給引導(dǎo)記錄,由引導(dǎo)記錄完成系統(tǒng)的啟動(dòng)。
?
什么是?CMOS
?
CMOS?(本意是指互補(bǔ)金屬氧化物半導(dǎo)體?——?一種大規(guī)模應(yīng)用于集成電路芯片制造的原料)是微機(jī)主板上的一塊可讀寫的?RAM?芯片,用來(lái)保存當(dāng)前系統(tǒng)的硬件配置和用戶對(duì)某些參數(shù)的設(shè)定。?CMOS?可由主板的電池供電,即使系統(tǒng)掉電,信息也不會(huì)丟失。?CMOS RAM?本身只是一塊存儲(chǔ)器,只有數(shù)據(jù)保存功能,而對(duì)?CMOS?中各項(xiàng)參數(shù)的設(shè)定要通過(guò)專門的程序。早期的?CMOS?設(shè)置程序駐留在軟盤上的?(?如?IBM的?PC/AT?機(jī)型?)?,使用很不方便。現(xiàn)在多數(shù)廠家將?CMOS?設(shè)置程序做到了?BIOS?芯片中,在開機(jī)時(shí)通過(guò)特定的按鍵?就可進(jìn)入?CMOS?設(shè)置程序方便地對(duì)系統(tǒng)進(jìn)行設(shè)置,因此?CMOS?設(shè)置又被叫做?BIOS?設(shè)置。?早期的?CMOS?是一塊單獨(dú)的芯片MC146818A(DIP?封裝?)?,共有?64?個(gè)字節(jié)存放系統(tǒng)信息?,?見?CMOS?配置數(shù)據(jù)表。?386以后的微機(jī)一般將?MC146818A?芯片集成到其它的?IC?芯片中?(?如?82C?206?,?PQFP?封裝?)?,最新的一些?586?主板上更是將?CMOS?與系統(tǒng)實(shí)時(shí)時(shí)鐘和后備電池集成到一塊叫做?DALLDA DS1287?的芯片中。隨著微機(jī)的發(fā)展、可設(shè)置參數(shù)的增多,現(xiàn)在的?CMOS RAM?一般都有?128?字節(jié)及至?256?字節(jié)的容量。為保持兼容性,各?BIOS?廠商都將自己的?BIOS?中關(guān)于?CMOS RAM?的前?64?字節(jié)內(nèi)容的設(shè)置統(tǒng)一與?MC146818A?的?CMOS RAM?格式一致,而在擴(kuò)展出來(lái)的部分加入自己的特殊設(shè)置,所以不同廠家的?BIOS?芯片一般不能互換,即使是能互換的,互換后也要對(duì)?CMOS?信息重新設(shè)置以確保系統(tǒng)正常運(yùn)行。
?
二、工作原理介紹
?
下面從計(jì)算機(jī)加電開始,看?BIOS?是如何一步一步工作的:
?
1、?????????????加電
計(jì)算機(jī)電源開始工作,當(dāng)電源的輸入電壓穩(wěn)定以后,主板的?timer?被觸發(fā),它產(chǎn)生一個(gè)復(fù)位脈沖送給?80X86cpu?讓?cpu?開始工作,當(dāng)?cpu?收到該復(fù)位脈沖后,其硬件邏輯就會(huì)置?CS?寄存器為?FFFFH?,?IP?寄存器為?0000H?,也就是說(shuō),會(huì)自動(dòng)地到FFFF:0000H?去取第一條指令,(在對(duì)內(nèi)存編址的時(shí)候,高地址部分總是編給一些ROM?,在這些?ROM?里是預(yù)先寫好的程序或數(shù)據(jù),地址?FFFF?:?0000h?其實(shí)就是在ROM?里。以前不懂這個(gè)規(guī)則的時(shí)候著實(shí)被搞糊涂了,不明白?FFFF?:?0000h?里的跳轉(zhuǎn)指令是哪里來(lái)的,其實(shí)就是寫死在?ROM?里的了,就這么簡(jiǎn)單。)?這個(gè)地方只有一條JMP?指令,告訴處理器到什么地方讀取?BIOS ROM?。
?
2?、?POST
POST?其實(shí)是一系列的執(zhí)行不同初始化和計(jì)算機(jī)硬件檢測(cè)的函數(shù)或例程。?BIOS以對(duì)主板硬件的一系列檢測(cè)開始,包括檢測(cè):?cpu?,數(shù)學(xué)協(xié)處理器、時(shí)鐘?IC?,?DMA控制器和中斷請(qǐng)求(?IRQ?)控制器,檢測(cè)的順序根據(jù)主板的不同而不同。
然后,?BIOS?會(huì)在地址?C000:000h?和?C780:000h?之間檢測(cè)視頻?ROM?是否存在,如果視頻?BIOS?存在,則對(duì)視頻?ROM?中的內(nèi)容求校驗(yàn)和進(jìn)行檢測(cè),如果檢測(cè)成功,則BIOS?將控制權(quán)轉(zhuǎn)交給視頻?BIOS?讓其初始化當(dāng)完成時(shí)再將控制權(quán)交回給?BIOS?。此時(shí)你將會(huì)在屏幕上看到顯卡信息,例如顯卡制造商的?logo?,顯卡的描述信息,以及顯卡BIOS?信息等。
然后?BIOS?以?2K?的增量掃描?C800:000h?到?DF800:000h?直接的地址,以檢測(cè)計(jì)算機(jī)中可能裝的其他?ROM?,比如網(wǎng)卡、?SCSI?適配器等,如果找到一個(gè)設(shè)備的?ROM?,則對(duì)該設(shè)備的?ROM?中的內(nèi)容做校驗(yàn)和,如果檢測(cè)通過(guò)則將控制權(quán)轉(zhuǎn)交給設(shè)備?BIOS讓其對(duì)設(shè)備進(jìn)行初始化,初始化結(jié)束后?BIOS?再收回控制權(quán),如果校驗(yàn)和檢測(cè)失敗,將再屏幕上顯示:“?XXX ROM Error?”,其中?XXX?是檢測(cè)到該?ROM?的地址的斷地址。
然后,?BIOS?開始檢測(cè)地址為?0000:0472h?的內(nèi)存,該處存放這一個(gè)標(biāo)識(shí)系統(tǒng)是通過(guò)冷啟動(dòng)啟動(dòng)還是通過(guò)熱啟動(dòng)啟動(dòng)的標(biāo)志,如果為?1234h?則代表熱啟動(dòng)(該數(shù)值是一little endian?的格式存儲(chǔ)的,因此在內(nèi)存中的應(yīng)為?3412?),?BIOS?將直接跳過(guò)剩余的POST?例程。如果是冷啟動(dòng),?BIOS?將繼續(xù)執(zhí)行剩余的?POST?例程,在此過(guò)程中,BIOS?將一個(gè)?16?進(jìn)制的編碼寫到端口?80h?(不同的計(jì)算機(jī)端口號(hào)會(huì)不同),這個(gè)?16?進(jìn)制編碼指示在何時(shí)檢測(cè)什么。
?
3?、引導(dǎo)操作系統(tǒng)
POST?結(jié)束之后,?BIOS?會(huì)尋找一個(gè)操作系統(tǒng)。通常,?BIOS?會(huì)試圖在軟驅(qū)中尋找DOS?系統(tǒng)的引導(dǎo)盤,如果找不到,它會(huì)試圖在?C?盤尋找操作系統(tǒng)。如果軟驅(qū)中有引導(dǎo)盤,?BIOS?將?1?扇區(qū)?0?磁頭?0?柱面的內(nèi)容(引導(dǎo)記錄)載入內(nèi)存?0000?:?7C?00h?開始的地方。如果軟盤中沒(méi)有?DOS?引導(dǎo)盤,則?BIOS?搜索硬盤尋找硬盤的第一個(gè)扇區(qū),然后把主引導(dǎo)記錄(?MBR?)載入內(nèi)存?0000?:?7C?00h?開始的地方。?一旦引導(dǎo)記錄加載完畢,?BIOS?就交出系統(tǒng)的執(zhí)行控制權(quán),跳轉(zhuǎn)到引導(dǎo)程序的頭部執(zhí)行。下面就是硬盤的?MBR?代碼流程,其中的引導(dǎo)扇區(qū)是指硬盤相應(yīng)分區(qū)的第一個(gè)扇區(qū),是和操作系統(tǒng)有關(guān)的操作系統(tǒng)的引導(dǎo)是由它來(lái)完成的,而?MBR?(硬盤的第一個(gè)扇區(qū))并不負(fù)責(zé),MBR?和操作系統(tǒng)無(wú)關(guān)他的任務(wù)是把控制權(quán)轉(zhuǎn)交給操作系統(tǒng)的引導(dǎo)程序?。
程序流程:
1?將程序代碼由?0000:7C00H?移動(dòng)到?0000:0600H?(注,?BIOS?把?MBR?放在0000:7C00H?處)
2?搜索可引導(dǎo)分區(qū),即?80H?標(biāo)志
成功:?goto 3
失敗:跳入?ROM BASIC
無(wú)效分區(qū)表:?goto 5
3?讀引導(dǎo)扇區(qū)?(?注:用于操作系統(tǒng)的引導(dǎo),將它讀到?0000?:?7C?00H)
失敗:?goto 5
成功:?goto 4
4?驗(yàn)證引導(dǎo)扇區(qū)最后是否為?55AAH
失敗:?goto 5
成功:?goto 6
5?打印錯(cuò)誤進(jìn)入無(wú)窮循環(huán)
6?跳到?0:7C00H?進(jìn)行下一步啟動(dòng)工作
總結(jié)
- 上一篇: RS232与RS485的功能与区别
- 下一篇: 微内核与宏内核