计算机启动详解

来源:互联网 发布:js中数组元素个数 编辑:程序博客网 时间:2024/06/04 19:48
 
计算机启动详解[原创]
作者:小飞 2008-01-04 上海 [学习 汇编 和OS设计 时 参照各种资料后整理]
1.电源加电
 
我们在按下启动键时,首先启动的应是电源(因为如果没有电源供电,那么主板上所有的配件都是无法工作的)。
由于从开关电源起, 振荡到电源稳定之间会有一段时间的延迟,此时电压还不稳定,
为了保证安全使用,电源部分采取了一系列安全保护措施, 主板控制芯片组会向CPU发出并保持一个RESET(重置)信号,让CPU等待电源发出的POWER GOOD信号(电源准备好信号)。如果主板接受不到这个信号,那么时钟芯片会持续向CPU发送复位(RESET)信号, CPU就不会工作。
当电源开始稳定供电后(当然从不稳定到稳定的过程也只是短暂的瞬间),电源稳定后就送出一个POWER GOOD信号, 芯片组便撤去RESET信号. 此时CPU收到 POWER GOOD 信号.
   [注: PC机的复位线和系统中的所有部件相连,包括CPU的RESET引脚]
 
2.CPU接受到正常的POWER GOOD信号后的一些准备工作
 
当CPU接受到正常的POWER GOOD信号,主板和CPU就启动了吗?其实主板此时,还要根据CPU的VID0-VID3引脚的定义组合,将CPU所提供的VID0-VID3信号送到电源管理模块的相应的端口;如果主板BIOS具有可设定CPU电压的功能,主板会按时设定的电压与VID的对应关系产生新的VID信号并送到电源管理模块芯片,电源管理模块将根据设定并通过DAC电压将其转换为基准电压,再经过场效应管轮流导通和关闭,将能量通过电感线圈送到CPU,最后再经过调节电路使用输出电压与设定电压值相当。
  
     由于CPU还要根据自己所需要的频率,通过IC总线来检测主板频率发生器所设置的频率是否支持;因为电脑要进行正确的数据传送以及正常的运行,没有时钟信号是不行的,时钟信号在电路中的主要作用就是同步;因为在数据传送过程中,对时序都有着严格的要求,只有这样才能保证数据在传输过程不出差错。时钟信号首先设定了一个基准,我们可以用它来确定其它信号的宽度,另外时钟信号能够保证收发数据双方的同步。对于CPU而言,时钟信号作为基准,CPU内部的所有信号处理都要以它作为标尺,这样它就确定CPU指令的执行速度;如CPU本身的频率无法适应频率发生器所提供的高频率,也是无法正常工作的。因此只有当接受到POWER GOOD信号,和相应的得到CPU工作的电压时以及相应的时钟频率后,CPU才能正常的工作. 到此 CPU 已经READY 了.
  
3. CPU 开始执行 BIOS芯片里的 POST(Power On Self Test)[加电自检] 程序.
 
[背景知识: BIOS基本上由以下几部分组成:  
 (1)BIOS中断服务程序  
 (2)BIOS系统设置程序  
 (3)POST(Power   On   Self   Test,上电自检)程序  
 (4)系统启动自举程序  
 BIOS是存储在ROM(也可能是PROM,EPROM,EEPROM)中的一些程序,基本上由以上列出的四个部分组成.
为了与硬件和一般软件区别, 此类固化在ROM中的程序通常称为fireware]
                   
CPU 开始第一步工作. 即立刻执行BIOS芯片里的 POST 程序. [注意:此时CPU直接在BIOS芯片里取指令执行,而不是内存, 内存此时还没有检测和初始化]   
      
    这一过程是逐一进行的,BIOS厂商对每一个设备都给出了一个检测代码(称为POST CODE即开机自我检测代码),在对某个设置进行检测时,首先将对应的POST CODE写入80H(地址)诊断端口,当该设备检测通过,则接着送另一个设置的POST CODE,对此设置进行测试。如果某个设备测试没有通过,则此POST CODE会在80H处保留下来,检测程序也会中止,并根据已定的报警声进行报警(BIOS厂商对报警声也分别作了定义,不同的设置出现故障,其报警声也是不同的,我们可以根据报警声的不同,分辨出故障所在。
 
POST自检测过程大致为:加电-CPU-ROM-BIOS-System Clock-DMA-64KB RAM-IRQ-显卡等。检测显卡以前的过程称过关键部件测试,如果关键部件有问题,计算机会处于挂起状态,习惯上称为核心故障。另一类故障称为非关键性故障,检测完显卡后,计算机将对64KB以上内存、I/O口、软硬盘驱动器、键盘、即插即用设备、CMOS设置等进行检测,并在屏幕上显示各种信息和出错报告。在正常情况下,POST过程进行得非常快,我们几乎无法感觉到这个过程。
  
4. CPU开始执行BIOS 芯片里的 系统启动自举程序 , 用来加载MBR(Main Boot Record) 主引导记录.
 
在POST上电自检测完成后,CPU会从地址FFFF0H处开始执行指令,
FFFF:0000这是一个固定的位置,这个地址在系统BIOS的地址范围内[这里的地址: FFFF0H 不是内存地址, 而是一个硬件地址],无论是Award BIOS还是AMI BIOS,放在这里的只是一条跳转指令,跳到系统BIOS中真正启动代码处。由于BIOS是连接操作系统和硬件之间的桥梁,为计算机提供最低级的、最直接的硬件控制,计算机的原始操作都是依照固化在BIOS里的内容(指令)来完成的。
 
BIOS 启动程序开始寻找启动盘, 检查启动盘的 0面0磁道1扇区, 如果发现是以 0Xaa55结尾, 则认为它是一个引导扇区(Boot Sector). [此扇区里的数据即通常所说的 MBR(Main Boot Record) 主引导记录]
然后把这个512 Bytes 的Boot Sector 装载到内存 0000:7c00 处 , 然后跳到 0000:7c00 处将控制权交给这段引导代码. [此后 计算机不再由 BIOS 中固有的程序来控制,而变成OS 的一部分来控制, 在此以后的指令都是在内存中的了.]
 
下面是 BOOT SECTOR 的引导程序一个例子:
; boot.asm list file NASM assembly
1                                  org 07c00h
     2 00000000 8CC8                    mov ax, cs
     3 00000002 8ED8                    mov ds, ax
     4 00000004 8EC0                    mov es, ax
     5 00000006 E80200                  call DispStr
     6 00000009 EBFE                    jmp $
     7                                  DispStr:
     8 0000000B B8[1E00]                  mov ax, BootMessage
     9 0000000E 89C5                      mov bp, ax
    10 00000010 B91000                    mov cx, 16
    11 00000013 B80113                    mov ax, 01301h
    12 00000016 BB0C00                    mov bx, 000ch
    13 00000019 B200                      mov dl, 0
    14 0000001B CD10                      int 10h
    15 0000001D C3                        ret
    16 0000001E 48656C6C6F2C204F53-     BootMessage: db "Hello, OS world!"
    17 00000027 20776F726C6421    
    18 0000002E 00<rept>                times 510-($-$$) db 0
    19 000001FE 55AA                    dw 0xaa55
 
5. CPU 开始执行 OS[操作系统]的引导程序
 
不同的OS 都不同, 但是引导程序通常会: 从16位real mode[实模式] 切换到 32 位的 protect mode[保护模式], 并把BIOS 复制或者映射到内存低端的地址区 [不同的OS 有差别]. 初始化GDTR[全局向量表寄存器] 和填充GDT [全局向量表] 和 其他系统表.
 
6.开始OS全面初始化, 进入用户登陆界面.