前往顾页
以后地位: 主页 > 精通Office > 其他教程 >

BIOS启动过程阐发

时候:2015-07-19 22:11来源:知行网www.zhixing123.cn 编辑:麦田守望者

一、弁言

对电脑用户来讲,翻开电源启动电脑几近是每天必做的事情,但计较机在显现这些启动画面的时候在做甚么呢?年夜多数用户都一定清楚了。下面就向年夜家介绍一下从翻开电源到呈现windows的登录窗口,计较机到底干了些甚么事情,BIOS在此中起到甚么感化。

电脑的启动过程中有一个非常完美的硬件自检机制。对采取Award BIOS的电脑来讲,它在上电自检那长久的几秒钟里,便可以完成100多个检测步调。

术语或缩写 描述
BIOS 根基输入/输入体系
CMOS 保存体系以后的硬件建设环境和用户的设定参数
POST Power on self test, 加电自检
   

2、先介绍几个根基观点

1)BIOS

BIOS即根基输入/输入体系,它是被固化在计较机ROM芯片上的一组法度。它是微机体系软、硬件之间的一个可编程接口,经由过程跳线开关和体系配带的驱动法度盘,可以对ROM进行重写,便利地实现BIOS进级。

2)CMOS

CMOS是一块可读写的RAM芯片,保存体系以后的硬件建设环境和用户的设定参数;BIOS中装有一个法度称为“体系设置法度”,设置CMOS中的参数;CMOS由电池供电,断电后数据会丧失;前16字节用于存储时候.

3)AMI、AWARD和PHONIX三年夜主流BIOS厂商

开辟BIOS是一件技术含量很高的事情,从业职员也少;一流主板厂商的BIOS研发职员,年薪常常是以七位数字来计较的!

3、BIOS首要服从

BIOS的首要服从概括来讲包含以下几部分:

1)POST

加电自检,检测CPU各存放器、计时芯片、间断芯片、DMA节制器等

2)Initial

枚举装备,初始化存放器,分派间断、IO端口、DMA资本等

3)Setup

进行体系设置,存于CMOS中。一般开机时按Del或F2进入到BIOS的设置界面。

4)常驻法度

INT 10h、INT 13h、INT 15h等,供应给操纵体系或利用法度调用。

5)启动自举法度

在POST过程结束后,将调用INT 19h,启动自举法度,自举法度将读取引导记录,装载操纵体系。

4、BIOS源代码布局阐发

1)AMI BIOS代码布局阐发

AMI BIOS的代码首要分成三年夜部分:核心代码、芯片代码和OEM代码。

核心代码目次布局以下:

AMI BIOS代码结构

AMI BIOS代码布局

2)AWARD BIOS代码布局阐发

AWARD BIOS的源代码为进行目次分类,所有的源码、编译链接东西、天生的中间文件都在同一个目次中。没有AMI代码布局构造得好。

5、BIOS常驻法度介绍

开机自检法度运行完后,将撤出内存。BIOS供应了一组常驻法度,首要包含INT 10h,INT 13h,INT 15h等等间断办事例程,供应给操纵体系或利用法度调用,下面介绍几个常常利用的间断办事例程。X86供应了256个间断,间断向量表在内存的肇端地点1024byte上,每个间断向量地点占用4个字节。

1)INT 13H间断例程

INT 13h为BIOS供应的对磁盘进行操纵的间断例程,包含以下几种调用体例:

(1)INT 13H,AH=00H 软、硬盘节制器复位;

(2)INT 13H,AH=02H 读扇区申明;

(3)INT 13H,AH=03H 写扇区;

(4)INT 13H,AH=04H 检测扇区;

以上调用体例详细的申明请参考相关技术文档。

举例:读取软驱0面0道1扇区的内容到0:200


mov ax,0                     /* 初始化ax存放器为0 */

mov es,ax                    /* 将es置为0 */

mov bx,200h        /* 将bx设置为200h ,此时es:dx = 0:200,为内存地点*/

mov al,1                      /* al保存扇区数 */

mov ch,0                     /* ch保存磁道号 */

mov cl,1                  /* cl保存扇区号 */

mov dl,0               /* dl保存驱动器,0表示软驱A */

mov dh,0                     /* dh保存磁头号 */

mov ah,2                     /* ah保存int13要调用的服从号,2表示读 */

int 13h                         /* 调用int13间断 */

入口参数:

ah=int 13h的服从号

al=读取的扇区数

ch=磁道号

cl=扇区号

dh=磁头号(对软盘即面号,因为一个面用一个磁头来读写)

dl=驱动器号 软驱从0开端,0:软驱A,1:软驱B;硬盘从80h开端,

80h:硬盘C,81h:硬盘D。

es:bx指向领受从扇区读入数据的内存区

前往参数:

操纵成功:ah=0,al=读入的扇区数

操纵失败:ah=出错代码

2)INT 10H间断例程

屏幕I/O接口,切换各笔墨/图形形式,供应显现/画图卷页办事。详细的调用体例可以参考相关的文档。比方00号服从:


服从号:00H

服从:设置显现形式
入口参数:AH=00H
AL=显现形式
显现形式列表:

显现形式  显现形式属性
00H       40×25    16色 文本
01H       40×25    16色 文本
02H       80×25    16色 文本
04H       320×200   4色
05H       320×200   4色
06H       640×200   2色
07H       80×25     2色 文本
08H       160×200  16色
09H       320×200  16色
0AH       640×200   4色
0BH       保存
0CH       保存
0DH       320×200  16色
0EH       640×200  16色
0FH       640×350   2色(单色)
10H       640×350   4色
11H       640×480   2色
12H       640×480  16色
13H       320×200 256色

3)INT 16H间断例程

BIOS供应的键盘读取间断办事,服从以下表:

AH 服从 前往参数
0 从键盘读一字符 AL=字符码AH=扫描码
1 读键盘缓冲区的字符 如ZF=0AL=字符码AH=扫描码

 

如ZF=1,缓冲区空

2 取键盘状况字节 AL=键盘状况字节

调用体例:


MOV  AH,0         ; 读字符服从
INT   16H          ; 键盘BIOS调用

4)用DEBUG东西获得间断例程的内存地点

在DOS形式下,进入DEBUG,输入


a100

int 10

t=100

得 0210:08A9

int 10h的间断办事法度入口地点存放在间断向量表中的物理地点是0000:0040H~0043H,指向CS:IP(0210:08A9),以下图履行成果:

DEBUG工具获取中断例程的内存地址

DEBUG东西获得间断例程的内存地点

6、启动过程阐发

1)Linux体系开机启动的团体流程

Linux系统开机启动的总体流程

Linux体系开机启动的团体流程

2)BIOS启动过程概述

BIOS启动的过程首要包含POST过程和自举过程,其流程和履行指令地点的转变以下:

BIOS启动过程概述

BIOS启动过程概述

3)POST过程阐发

POST过程在AWARD BIOS的源码中在BOOTROM.ASM文件中BootBlock_POST函数过程中实现,首要步调以下:

(1)初始化各种主板芯片组

(2)初始化键盘节制器8042

(3)初始化间断向量 ,间断办事例程.

(4)初始化 VGA BIOS 节制器

(5)显现BIOS的版本和公司称呼

(6)扫描软驱和各种介质容量

(7)读取CMOS的启动依次建设,并检测启动装配是不是一般

(8)调用INT 19h启动自举法度

以上每个过程都丰年夜量的代码,在这不一一做细心阐发,请参考源代码。下面对第三步源码做一些阐发。

4)间断向量表初始化过程源码阐发

间断向量表存储在内存的第一个1k空间里,本节首要阐发AWARD BIOS中间断向量办事例程的初始化过程。


;[]==============================================================[]

;

;      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

以上代码从37行开端为初始化间断办事例程,第37行的Int_Tb1为BIOS定义的间断办事例程列表,用于替代呼应的间断办事。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

间断办事例程对应的函数也在Bootrom.asm文件中有实现。替代的间断办事例程总结以下。

间断号 BIOS间断例程 属性 备注
INT02 NMI_VECT 硬间断 None Maskable Interrupt,不成樊篱间断
INT06 LOADALL 错误间断 不法,不支撑的指令
INT08 TIMER_VECT 硬间断 IRQ0,体系定时器间断
INT09 KBDINT_VECT 硬间断 IRQ1,键盘间断
INT0E DSKINT_VECT 硬间断 IRQ6,软盘驱动器读写间断
INT11 EQ_VECT 软间断 PC核心装备查抄
INT12 MEM_SZ_VECT 软间断 PC主存储器年夜小查抄
INT13 DSK_VECT 软间断 磁盘I/O接口(读写、复位等)
INT15 Multi_Service 软间断 卡带接口办事法度,AT扩展间断办事调用,法度多任务
INT16 KBD_VECT 软间断 键盘读取办事法度
INT19 INT19_VECT 软间断 激活操纵体系的入口点
INT1A INT1A_VECT 软间断 BIOS时候接口
INT1E FD_BIOS_PARMS 软间断 软盘驱动器参数地点表

AWARD的其他间断办事调用未在BIOS中指定办事例程。

5)自举过程源码阐发

自举过程即为履行间断INT19的间断办事例程INT19_VECT的过程,该过程在AWARD的Bootrom.asm文件中实现,其首要服从为读取操纵体系启动块,将其读入到内存0000:7C00h,并跳转至此处履行。下面阐发一下操纵体系启动块MBR是若何从磁盘中读取到内存0000:7C00h处的。


new_dsk:

xor  dx,dx

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

xor  ax,ax

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

Boot_Fail:

lea   ax,Bad_Disk_Msg       ; boot failed

mov cx,Bad_Disk_Msg_Len

call  Disk_Fail_Routine

xor  ax,ax                           ; g_ram

jmp short new_dsk

 

Disk_Fail_Routine:

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

流程图以下:

自举过程

自举过程

------分开线----------------------------
标签(Tag):BIOS启动过程
------分开线----------------------------
保举内容
猜你感兴趣