什么是BIOS?
BIOS:basic inout/output system基本输入输出系统.它是固化在ROM上的一段程序,但电脑电源打开的时候,BIOS是第一个被执行的程序。其他的程序都必须先加载到RAM才能运行。

认识BIOS首先要知道几个名词:北桥,南桥,FLASH Memory,CMOS,SMBIOS

   南北桥:主板芯片组,北桥主要控制着CPU和内存;南桥:负责PCI,PCI-E,USB,VGA等外围设备。南桥里面有一个特殊的区块,即负责存储CMOS的空白区域,是用来让BIOS存储用户设置的地方。主板上的纽扣电池就是这个CMOS供电的。

   当BIOS激活时会先去确认CMOS中的资料是否正确,如果正确,便会将之前用户存储在CMOS的资料,加上已存在或者找到的硬件信息,整合成一个表格,写到内存中,也就是所谓的SMBIOS。如果有错误,则会自动以默认值取代CMOS提供的资料。所以这份写入内存的SMBIOS表格,就是用户进入BIOS选项后,可以看到的信息。
BIOS能做什么?

主要作用有四点:

1.自动检测并进行初始化:BIOS在开机的同时,会先对主板上的所有相关芯片进行检测,并通知各芯片开始运行。

2.纪录系统设置值:用户可以通过设置BIOS来改变各种不同的设置,比如onboard显卡的内存大小。

3.中断处理:主板上的任何资源都是由BIOS分配的,包括IRQ,也就是所有AGP/PCI/PCI-E槽所需要被赋予的珍贵资源。

4.加载操作系统:用户手上所有的操作台,都是由BIOS转交给引导扇区,再由引导扇区转到个分区激活相应的操作系统。

启动过程:

1.启动电源。2.inital北桥。3.将程序载入内存中。4.读取南桥的CMOS data 5.建立SMBIOS,并载入内存(之后用户通过BIOS菜单或者操作系统命令就可以看到BIOS的设置信息了)。 6.POST

* POST
POST(Power On Self Test)系统加电自检,内存地址为0fff:0000。
* Setup Menu
可以选择不同设备上引导程序(Boot sector loader)的顺序。
* Boot sector loader
This load the first 512-byte sector from the boot disk into RAM and jumps to it
* The BIOS interrupt
提供一些显示,键盘,磁盘等的基本操作
关于boot sector
* boot sector(引导扇区)的大小为512-byte,而且并不是512-byte都是可以用的,最后的两个字节必须是两个常量,0x55和0xAA,这是为了让BIOS识别这是一个boot sector。
*  引导扇区在每个分区里都存在,我们常说的“主引导扇区”是硬盘的第一物理扇区(物理地址0面0道1扇区)。它是有两个部分组成:主引导记录MBR(Master Boot Record)和硬盘分区表DPT(Disk

Partition Table),在512-byte的空间里面,其中MBR占446个字节(偏移0--偏移1bdh),DPT占64
个字节(偏移1beh--偏移1fdh),最后两个字节“55,AA”(偏移1feh,1ffh)是分区的结束标志。

——————————boot sector结构——————————
MBR
MBR中包含了硬盘的一系列参数和一段引导程序,引导程序主要是用来在系统硬件自检完后引导具有激活标志的分区上的操作系统,它执行到最后的是一条JMP指令跳到操作系统的引导程序中去。
DPT
MBR结束后,往下来是硬盘的分区表,它是由4个16字节的分区信息表组成,每个信息表的结构如下
偏移        长度       表达的意义
0          字节       分区状态: 如0-->非活动分区 80--> 活动分区
1          字节       该分区起始头(HEAD)
2          字         该分区起始扇区和起始柱面
4          字节       该分区类型:如82--> Linux Native分区,83--> Linux Swap 分区
5          字节       该分区终止头(HEAD)
6          字         该分区终止扇区和终止柱面 !
8          双字       该分区起始绝对分区
C          双字       该分区扇区数
接下来就是两个分区表的结束标志0x55,0xAA

 

一. Boot Sector 的组成
Boot Sector 也就是硬盘的第一个扇区(注1:0柱面,0磁道,1扇区) (注2: 1磁道=16扇区,1扇区=512字节), 它由 MBR (Master Boot Record), DPT (Disk Partition Table) 和 Boot Record ID 三部分组成 .
MBR 又称作主引导记录占用 Boot Sector 的前 446 个字节 ( 0 to 0x1BD ),
存放系统主引导程序 (它负责检查硬盘分区表、寻找可引导分区并负责将可引导分区的引导扇区(DBR)装入内存 ).
DPT 即主分区表占用 64 个字节 (0x1BE to 0x1FD), 记录了磁盘的基本分区
信息. 主分区表分为四个分区项, 每项 16 字节, 分别记录了每个主分区的信息
(因此最多可以有四个主分区 ).
Boot Record ID 即引导区标记占用两个字节 (0x1FE and 0x1FF), 对于合法
引导区, 它等于 0xAA55, 这是判别引导区是否合法的标志 .
Boot Sector 的具体结构如下图所示 :
0000 |------------------------------------------------|
      | |
     | |
     | Master Boot Record |
     | |
        | |
        | 主引导记录(446字节 )     |
      | |
        | |
     | |
01BD | |
01BE |------------------------------------------------|
      | |
01CD | 分区信息 1(16字节 )    |
01CE |------------------------------------------------|
                | |
01DD | 分区信息 2(16字节 )     |
01DE |------------------------------------------------|
                | |
01ED | 分区信息 3(16字节 )    |
01EE |------------------------------------------------|
      | |
01FD | 分区信息 4(16字节 )       |
        |------------------------------------------------|
        | 01FE | 01FF        |
        | 55    | AA       |
      |------------------------------------------------|

 

二. 系统启动过程简介
系统启动过程主要由一下几步组成(以硬盘启动为例):
1. 开机
2. BIOS 加电自检 ( Power On Self Test -- POST )内存地址为 0ffff:0000
3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)读入内存地址 0000:7c00 处.(注3:遇到最后两个字节55 AA读入内存执行)
4. 检查 (WORD) 0000:7dfe(共512B=一个扇区大小) 是否等于 0xaa55, 若不等于
则转去尝试其他启动介质, 如果没有其他启动介质则显示 "No ROM BASIC" 然后死机.
5. 跳转到 0000:7c00 处执行 MBR 中的程序.
6. MBR 首先将自己复制到 0000:0600 处, 然后继续执行.
7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动分区或有不止一个活动分区, 则转停止.
8. 将活动分区的第一个扇区读入内存地址 0000:7c00 处.

(注4:在分区表的四个记录中,一般来说有且只有一个记录的标记是活动的,MBR(主要负责从活动分区中装载并运行系统引导程序)会去找到这个分区记录,根据记录的起始扇区加载该分区的逻辑 0 扇区(起始扇区)的内容到 0x07C0:0000,并且执行 JUMP 0x07C0:0000(按照规范,BOOT RECORD 也应该从 0x07C0:0000 处开始执行,所以 MBR 通常都要先将自己搬移,以腾出位置去加载BOOT RECORD)。控制权切换到BOOT RECORD。BOOT RECORD(包括boot loader如grub或lilo 等)以 linux 为例,它会读取 linux 内核镜像到地址 0x9000:0000,然后开始切换到 0x9000:0000 继续运行。 以 MS-DOS 为例,则它会读取文件系统根目录下的 IO.SYS 和 MSDOS.SYS 两个文件然后加载到内存中继续运行。)
9. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则显示 "Missing Operating System" 然后停止, 或尝试软盘启动.
10. 跳转到 0000:7c00 处继续执行特定系统的启动程序.
11. 启动系统 ...

以上步骤中 2,3,4,5 步是由 BIOS 的引导程序完成. 6,7,8,9,10步由MBR中的引导程序完成.
一般多系统引导程序 (如 SmartFDISK, BootStar, PQBoot 等)
都是将标准主引导记录替换成自己的引导程序, 在运行系统启动程序之前让用户选择要启动的分区.
而某些系统自带的多系统引导程序 (如 lilo, NT Loader 等)则可以将自己的引导程序放在系统所处分区的第一个扇区中, 在 Linux中即为 SuperBlock (其实 SuperBlock 是两个扇区).
注: 以上各步骤中使用的是标准 MBR, 其他多系统引导程序的引导过程与此不同.

注5:一些早期的引导型病毒,以及某些 bootloader,还有些硬盘加密卡,他们会修改 MBR,做个“钩子