简单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,ES,SS初始值为0(CPU处于实模式下)
-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(该地址为BIOS的ROM POST代码)
- jump to CS:IP (execute POST, Power On Self test)
CPU工作,开始取第一条指令(执行POST,开机自检)
看一下Intel的specification中的CPU上电后各个寄存器的初始化值。
1、CR0.PE = 0 处理器处于实模式 此位决定了BIOS程序执行时的寻址方式
2、RIP = FFF0h
3、CS.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:0到f400: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.
- 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 1的Master Boot Record(硬盘的第一个扇区),如果它找到的是Floppy Disk,它也会读区软盘的第一个扇区。 如果找不到任何启动设备,系统将会显示一条错误信息,然后冻结系统。如果找到了响应的启动设备,BIOS会将读到的扇区放在内存7C00h的位置,并跳转到那里执行它。从此以后,就有硬件启动阶段进入了OS启动阶段。
- ~WARM BOOT~ procedure is now executed
开始执行热启动
到这里基本的硬件启动和初始化都已经完成了,剩下的就是OS的bootloader工作了。
BIOS的开发其实不比操作系统简单多少,以后有机会再深入分析BIOS,下一步就是写bootloader。
待续……
- 简单OS开发前奏(二)BIOS启动过程-硬件检测及初始化浅析
- 简单OS开发前奏(二)BIOS启动过程-硬件检测及初始化浅析
- 简单OS开发前奏(三)操作系统装载过程及BootSector的汇编语言实现
- 简单OS开发前奏(三)操作系统装载过程及BootSector的汇编语言实现
- 从硬件入手介绍达芬奇DMSoC硬件部分及Linux OS的启动过程
- rails启动过程(二)初始化及initializer
- nginx启动初始化过程(二)
- BIOS启动过程分析
- BIOS启动过程分析
- BIOS启动过程分析
- BIOS启动过程
- windows BIOS 启动过程
- 简单OS开发前奏(一)EDITPLUS+MASM32搭建汇编开发环境(16位+32位)
- 简单OS开发前奏(一)EDITPLUS+MASM32搭建汇编开发环境(16位+32位)
- 浅析Mac OS X与Linux的启动过程
- 计算机启动过程及相关知识BIOS CMOS等
- μC/OS-II的初始化和启动过程
- Android启动过程及FrameWork初始化
- 谈三层结构与MVC模式的区别-------转载
- 使用Forms Authentication实现用户注册、登录 (一)基础知识
- 测试类提示错误:java.lang.NullPointerException
- 使用Forms Authentication实现用户注册、登录 (一)基础知识
- time_wait太多导致[error] (99)Cannot assign requested address: proxy
- 简单OS开发前奏(二)BIOS启动过程-硬件检测及初始化浅析
- 使用Forms Authentication实现用户注册、登录 (一)基础知识
- 使用Forms Authentication实现用户注册、登录 (一)基础知识
- ssh
- 使用Forms Authentication实现用户注册、登录 (一)基础知识
- 10G custom创建数据库中安装示例方案(sample schemas)
- 使用Forms Authentication实现用户注册、登录 (一)基础知识
- oracle sqlplus执行sql文件
- .NET ActiveX VCL控件仓库