1 引言1.1 文檔目的對于電腦用戶來說,打開電源啟動電腦幾乎是每天必做的事情,但計算機(jī)在顯示這些啟動畫面的時候在做什么呢?大多數(shù)用戶都未必清楚了。下面就向大家介紹一下從打開電源到出現(xiàn)Linux的登錄窗口,計算機(jī)到底干了些什么工作,BIOS在其中起到什么作用。 電腦的啟動過程中有一個非常完善的硬件自檢機(jī)制。對于采用Award BIOS的電腦來說,它在上電自檢那短暫的幾秒鐘里,就可以完成100多個檢測步驟。 1.2 術(shù)語和縮寫
2 基本概念2.1 BIOSBIOS即基本輸入/輸出系統(tǒng),它是被固化在計算機(jī)ROM芯片上的一組程序。它是微機(jī)系統(tǒng)軟、硬件之間的一個可編程接口,通過跳線開關(guān)和系統(tǒng)配帶的驅(qū)動程序盤,可以對ROM進(jìn)行重寫,方便地實(shí)現(xiàn)BIOS升級。 2.2 CMOSCMOS是一塊可讀寫的RAM芯片,保存系統(tǒng)當(dāng)前的硬件配置情況和用戶的設(shè)定參數(shù);BIOS中裝有一個程序稱為“系統(tǒng)設(shè)置程序”,設(shè)置CMOS中的參數(shù);CMOS由電池供電,斷電后數(shù)據(jù)會丟失;前16字節(jié)用于存儲時間 2.3 AMI、AWARD和PHONIX三大主流廠商開發(fā)BIOS是一件技術(shù)含量很高的工作,從業(yè)人員也少;一流主板廠商的BIOS研發(fā)人員,年薪往往是以七位數(shù)字來計算的!
3 BIOS主要功能BIOS的主要功能概括來說包括如下幾部分: 1)POST 加電自檢,檢測CPU各寄存器、計時芯片、中斷芯片、DMA控制器等 2)Initial 枚舉設(shè)備,初始化寄存器,分配中斷、IO端口、DMA資源等 3)Setup 進(jìn)行系統(tǒng)設(shè)置,存于CMOS中。一般開機(jī)時按Del或者F2進(jìn)入到BIOS的設(shè)置界面。 4)常駐程序 INT 10h、INT 13h、INT 15h等,提供給操作系統(tǒng)或應(yīng)用程序調(diào)用。 5)啟動自舉程序 在POST過程結(jié)束后,將調(diào)用INT 19h,啟動自舉程序,自舉程序?qū)⒆x取引導(dǎo)記錄,裝載操作系統(tǒng)。 4 BIOS源代碼結(jié)構(gòu)分析4.1 AMI BIOS代碼結(jié)構(gòu)分析AMI BIOS的代碼主要分成三大部分:核心代碼、芯片代碼和OEM代碼。 核心代碼目錄結(jié)構(gòu)如下:
4.2 AWARD BIOS代碼結(jié)構(gòu)分析AWARD BIOS的源代碼為進(jìn)行目錄分類,所有的源碼、編譯鏈接工具、生成的中間文件都在同一個目錄中。沒有AMI代碼結(jié)構(gòu)組織得好。 5 BIOS常駐程序介紹開機(jī)自檢程序運(yùn)行完后,將撤出內(nèi)存。BIOS提供了一組常駐程序,主要包括INT 10h,INT 13h,INT 15h等等中斷服務(wù)例程,提供給操作系統(tǒng)或應(yīng)用程序調(diào)用,下面介紹幾個常用的中斷服務(wù)例程。X86提供了256個中斷,中斷向量表在內(nèi)存的起始地址1024byte上,每個中斷向量地址占用4個字節(jié)。 5.1 INT 13h中斷例程INT 13h為BIOS提供的對磁盤進(jìn)行操作的中斷例程,包括如下幾種調(diào)用方式: 1)INT 13H,AH=00H 軟、硬盤控制器復(fù)位; 2)INT 13H,AH=02H 讀扇區(qū)說明; 3)INT 13H,AH=03H 寫扇區(qū); 4)INT 13H,AH=04H 檢測扇區(qū); 以上調(diào)用方法詳細(xì)的說明請參考相關(guān)技術(shù)文檔。 舉例:讀取軟驅(qū)0面0道1扇區(qū)的內(nèi)容到0:200 mov ax,0 /* 初始化ax寄存器為0 */ mov es,ax /* 將es置為0 */ mov bx,200h /* 將bx設(shè)置為200h ,此時es:dx = 0:200,為內(nèi)存地址*/ mov al,1 /* al保存扇區(qū)數(shù) */ mov ch,0 /* ch保存磁道號 */ mov cl,1 /* cl保存扇區(qū)號 */ mov dl,0 /* dl保存驅(qū)動器,0表示軟驅(qū)A */ mov dh,0 /* dh保存磁頭號 */ mov ah,2 /* ah保存int13要調(diào)用的功能號,2表示讀 */ int 13h /* 調(diào)用int13中斷 */ 入口參數(shù): ah=int 13h的功能號 al=讀取的扇區(qū)數(shù) ch=磁道號 cl=扇區(qū)號 dh=磁頭號(對于軟盤即面號,因?yàn)橐粋€面用一個磁頭來讀寫) dl=驅(qū)動器號 軟驅(qū)從0開始,0:軟驅(qū)A,1:軟驅(qū)B;硬盤從80h開始, 80h:硬盤C,81h:硬盤D。 es:bx指向接收從扇區(qū)讀入數(shù)據(jù)的內(nèi)存區(qū) 返回參數(shù): 操作成功:ah=0,al=讀入的扇區(qū)數(shù) 操作失敗:ah=出錯代碼
5.2 INT 10h中斷例程屏幕I/O接口,切換各文字/圖形模式,提供顯示/繪圖卷頁服務(wù)。詳細(xì)的調(diào)用方法可以參考相關(guān)的文檔。例如00號功能: 功能號:00H 功能:設(shè)置顯示模式 顯示模式 顯示模式屬性
5.3 INT 16h中斷例程BIOS提供的鍵盤讀取中斷服務(wù),功能如下表:
調(diào)用方法: MOV AH,0 ; 讀字符功能
5.4 用debug工具獲取中斷例程的內(nèi)存地址在DOS模式下,進(jìn)入DEBUG,輸入 a100 int 10 t=100 得 0210:08A9 int 10h的中斷服務(wù)程序入口地址存放在中斷向量表中的物理地址是0000:0040H~0043H,指向CS:IP(0210:08A9),如下圖執(zhí)行結(jié)果:
6 啟動過程分析6.1 Linux系統(tǒng)開機(jī)啟動的總體流程
6.2 BIOS啟動過程概述BIOS啟動的過程主要包括POST過程和自舉過程,其流程和執(zhí)行指令地址的變化如下:
6.3 POST過程分析POST過程在AWARD BIOS的源碼中在BOOTROM.ASM文件中BootBlock_POST函數(shù)過程中實(shí)現(xiàn),主要步驟如下: 1)初始化各種主板芯片組 2)初始化鍵盤控制器8042 3)初始化中斷向量 ,中斷服務(wù)例程. 4)初始化 VGA BIOS 控制器 5)顯示BIOS的版本和公司名稱 6)掃描軟驅(qū)和各種介質(zhì)容量 7)讀取CMOS的啟動順序配置,并檢測啟動裝置是否正常 8)調(diào)用INT 19h啟動自舉程序 以上每個過程都有大量的代碼,在這不一一做仔細(xì)分析,請參考源代碼。下面對第三步源碼做一些分析。 6.4 中斷向量表初始化過程源碼分析中斷向量表存儲在內(nèi)存的第一個1k空間里,本節(jié)主要分析AWARD BIOS中中斷向量服務(wù)例程的初始化過程。 ;[]==============================================================[] ; ; Initialize int. vectors (0-77h) to the spurious interrupt ; handler. Then initialize 00h-1fh to their proper places. ; ;[]==============================================================[] POST_CODE 12
mov ax,cs mov ds,ax
; ; Initialize vectors 00-77h to SPURIOUS_INT_HDLR ; 。。。。。。 。。。。。。 。。。。。。 ; ; Initialize vectors 00-1fh to the real handlers ;
lea si,DGROUP:Int_Tbl p10_21: lodsb ;load next offset cmp al,0ffh ;over? je short Init_Vect_Over ;Yes,skip movzx di,al ;get vector number shl di,2 ;set to coresspond offset movsw ;load offset from DS:[SI] mov ax,cs ;get segment stosw ;load segment jmp short p10_21 ;next cycle Init_Vect_Over:
mov al,10111100b ;Enable IRQ 0,1,6 out a8259+1,al sti 看以上藍(lán)色部分代碼,為初始化中斷服務(wù)例程,紅色部分Int_Tb1為BIOS定義的中斷服務(wù)例程列表,用于替換相應(yīng)的中斷服務(wù)。Int_Tb1的定義如下: INT_TBL: db 2 ; INT02 DW OFFSET DGROUP:NMI_VECT ; INT02 offset db 6 ; INT06 DW OFFSET DGROUP:LOADALL ; INVALID OP-CODE db 8 ; INT08 DW OFFSET DGROUP:TIMER_VECT ; INT08 offset db 9 ; INT09 DW OFFSET DGROUP:KBDINT_VECT ; INT09 offset db 0eh ; INT0E DW OFFSET DGROUP:DSKINT_VECT ; INT0E offset db 11h ; INT11 DW OFFSET DGROUP:EQ_VECT ; INT11 offset db 12h ; INT12 DW OFFSET DGROUP:MEM_SZ_VECT ; INT12 offset db 13h ; INT13 DW OFFSET DGROUP:DSK_VECT ; INT13 offset db 15h ; INT15 DW OFFSET DGROUP:Multi_Service ; INT15 offset db 16h ; INT16 DW OFFSET DGROUP:KBD_VECT ; INT16 offset db 19h ; INT19 DW OFFSET DGROUP:INT19_VECT ; INT19 offset db 1Ah ; INT1A DW OFFSET DGROUP:INT1A_VECT ; INT1A offset db 1Eh ; INT1E DW OFFSET DGROUP:FD_BIOS_PARMS ; INT1E offset db 0ffh ; over 中斷服務(wù)例程對應(yīng)的函數(shù)也在Bootrom.asm文件中有實(shí)現(xiàn)。替換的中斷服務(wù)例程總結(jié)如下。
AWARD的其他中斷服務(wù)調(diào)用未在BIOS中指定服務(wù)例程。 6.5 自舉過程源碼分析自舉過程即為執(zhí)行中斷INT19的中斷服務(wù)例程INT19_VECT的過程,該過程在AWARD的Bootrom.asm文件中實(shí)現(xiàn),其主要功能為讀取操作系統(tǒng)啟動塊,將其讀入到內(nèi)存0000:7C00h,并跳轉(zhuǎn)至此處執(zhí)行。下面分析一下操作系統(tǒng)啟動塊MBR是如何從磁盤中讀取到內(nèi)存0000:7C00h處的。 new_dsk: mov es,dx ; set to load at 0:offset Boot
mov bx,offset Boot ; location to load boot sector mov cx,1 ; set to read one sector int 13h ; reset disk mov ax,0201h ; read boot record int 13h ; read disk jc short Boot_fail call Check_Boot_Record ; check boot sector valid ? jc short Boot_fail ; invalid boot sector. jmp far ptr Boot ; go to boot code lea ax,Bad_Disk_Msg ; boot failed mov cx,Bad_Disk_Msg_Len call Disk_Fail_Routine jmp short new_dsk
mov dx,0ff01h call Display_Str
;Beep out if no bootable media mov bl,2 ; beep on override mov cx,1700h call SND_SPKR_TONE xor cx,cx loop short $ mov bl,5 ; beep on override mov cx,3000h call SND_SPKR_TONE ;wait for 'Enter' key to continue endless: xor ah,ah ;wait ENTER key int 16h cmp ah,1ch jne short endless
ret 流程圖如下:
7 參考資料 1)AMI和AWARD的BIOS源碼 2)grub-0.97.tar.gz源碼 3)AMI BIOS98 User Guide 4)AMI BIOS98 Technical Reference 5)《BIOS研發(fā)技術(shù)剖析》 6)網(wǎng)站搜索內(nèi)容: BIOS之家:www. |
|
|