简单OS开发前奏(二)BIOS启动过程-硬件检测及初始化浅析

来源:互联网 发布:金融行业大数据应用 编辑:程序博客网 时间:2024/06/10 02:46

BIOS就是基本输入输出系统,它是一组固化到计算机内主板上一个ROM芯片上的程序,保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为x86架构的计算机提供最底层的、最直接的硬件初始化设置和控制。一般来说没安装任何操作系统的计算机成为裸机,但是裸机并不裸,因为有BIOS,所以各种硬件仍然可以在你按下启动按钮之后有序的工作,只是这些工作是不为用户提供服务的。

BIOS的基本工作任务:
● POST
:开机自检
初始化阶段:对DRAM、芯片组,外围设备等设置
保存相应数据:在COMS RAM BIOS 数据区保存相应的数据
驻入服务例程:写入中断向量表及BIOS的中断服务例程等

 

现在来我们从按下开机按钮开始分析x86硬件系统执行的程序。

按下开机按钮

 

POST - Cold Boot / Power On Self Test Activities
POST -
冷启动、开机自检

- power supply starts Clock Generator (8284) with Power
通电后8284时序发生器开始工作

Good signal on BUS
总线产生正常信号

- CPU reset line is pulsed resetting CPU
CPU
的复位引脚被触发,CPU复位

- DS, ES, and SS are cleared to zero
DS
ESSS初始值为0CPU处于实模式下)

 

-Cold and Warm Boot both execute the following sequence
冷启动和热启动都会执行一下序列

- CS:IP are set to FFFF:0000 (address of ROM POST code)
CS:IP
初始值为FFFF:0000(该地址为BIOSROM POST代码)

- jump to CS:IP (execute POST, Power On Self test)


CPU
工作,开始取第一条指令(执行POST,开机自检)

 

看一下Intel的specification中的CPU上电后各个寄存器的初始化值。

 

1CR0.PE = 0  处理器处于实模式 此位决定了BIOS程序执行时的寻址方式
2RIP = FFF0h 
3CS.Base = FFFF_0000h
4、由于在实模式下,第一条指令的物理地址就在:CS.Base + RIP = FFFF_FFF0h

这里就得到了CPU要执行的第一条指令的物理地址PA:FFFF_FFF0h,这个地址还要经过MCH和ICH的映射处理,最终找到BIOS中被映射到内存中的代码  far jmp F000:xxxxh,根据BIOS的厂商不同跳转地址不同,而这个地址就是BIOS程序的入口地址。

该条指令执行后,CS.Selector和EIP都会被重置。自习想想,处理器处于实模式下那么其最大寻址空间是1M但是第一条指令的地址是FFFF_0000h,超出了1M的范围,所以要经过MCH和ICH的映射。这条指令执行之后就会跳转到1M以内的空间开始按照实模式的寻址方式执行代码。

 

 

 

下面就是BIOS内的固化程序执行过程了,

 
- interrupts are disabled
关中断

- CPU flags are set, read/write/read test of CPU registers
设置CPU标志位,用读、写、读来测试CPU寄存器

- checksum test of ROM BIOS
检测ROM BIOS的校验和

- Initialize DMA (verify/init 8237 timer, begin DMA RAM refresh)
初始化DMA(校验、初始化 8237时钟控制器,开始DMA 内存刷新)

- save reset flag then read/write test the first 32K of memory
保存复位标志,然后对内存的前32K字节进行读写测试

- Initialize the Programmable Interrupt Controller (8259)
and set 8 major BIOS ~interrupt~ vectors (interrupts 10h-17h)
初始化8259可编程中断控制器,设置好8个主要的BIOS中断向量
(INT 10h-17H)
- determine and set configuration information
检测并设置好CMOS配置信息

- initialize/test CRT controller & test video memory (unless 1234h
found in reset word)
初始化/测试CRT控制器,测试显存(除非在复位字的位置找到1234h

- test ~8259~ Programmable Interrupt Controller
测试8259可编程中断控制器

- test Programmable Interrupt Timer (~8253~)
测试8253可编程时钟中断控制器

- reset/enable keyboard, verify scan code (AAh), clear keyboard,
check for stuck keys, setup interrupt vector lookup table
复位、激活键盘,校验扫描码,清除键盘缓冲区,检查是否有卡住的键,设置中断查找表

- hardware interrupt vectors are set
设置硬件中断向量

- test for expansion box, test additional RAM
测试扩展设备,测试扩充内存

- read/write memory above 32K (unless 1234h found in reset word)
读写测试32K字节以上的内存(除非在复位字的位置找到1234h

- addresses C800:0 through F400:0 are scanned in 2Kb blocks in
search of valid ROM. If found, a far call to byte 3 of the ROM
is executed.
2K字节大小的块为单位,从c800:0f400:0扫描,查找有效映射的ROM。找到后,对ROM的第3个字节进行远程调用。

- test ROM cassette BASIC (checksum test)
检测ROM BASIC(校验和测试,现在的BIOS已取消ROM BASIC……

- test for installed diskette drives & ~FDC~ recalibration & seek
检测安装了的硬盘驱动器、软盘控制器。

 

在这里寻找一个启动设备,这些设备包括Floppy Disk(A:),或者Hard Disk(C:),还可以包括CD-ROM Driver或者其它设备。

 
- test printer and RS-232 ports. store printer port addresses
at 400h and RS-232 port addresses at 408h. store printer
time-out values at 478h and Serial time-out values at 47Ch.

检测打印机口和RS-232串口。把打印口地址保存在内存的400h,串口地址保存在408h。打印机超时值保存在478h,串口超时值保存在47Ch
- NMI interrupts are enabled
激活NMI中断

- perform ~INT 19~ (bootstrap loader), pass control to boot record
or cassette BASIC if no bootable disk found
执行INT 19h(引导装载程序),把控制权转交给引导程序

 

当找到响应的启动设备之后,BIOS将会查找Boot信息时能后续开始OS的启动过程。如果它找到了一个Hard Disk,它将会查找一个位于Cylinder 0, Head 0, Sector 1Master Boot Record(硬盘的第一个扇区),如果它找到的是Floppy Disk,它也会读区软盘的第一个扇区。 如果找不到任何启动设备,系统将会显示一条错误信息,然后冻结系统。如果找到了响应的启动设备,BIOS会将读到的扇区放在内存7C00h的位置,并跳转到那里执行它。从此以后,就有硬件启动阶段进入了OS启动阶段。

- ~WARM BOOT~ procedure is now executed

 

开始执行热启动

到这里基本的硬件启动和初始化都已经完成了,剩下的就是OS的bootloader工作了。

BIOS的开发其实不比操作系统简单多少,以后有机会再深入分析BIOS,下一步就是写bootloader。

待续……
 

 

原创粉丝点击