注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

指南针的天空

你永远也看不到我最寂寞时候的样子,因为只有你不在我身边的时候,我才最寂寞。

 
 
 

日志

 
 

基于8086的IBM PC开机过程  

2010-06-30 22:29:28|  分类: 日常记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |







首先我要解释一下这个题目,为什么一定要强调“基于8086的IBM PC”呢?只说“PC 开机过程”不就完了吗?难道现在我们用的Pentium PC机和以前的老古董开机过程还有什么差别吗?从大致流程看,没有差别,但是进一步细化后去研究就会发现有很多不同了,其中对开机过程影响最大的就是 CPU寻址能力的改变,从286以后CPU的寻址范围增大了,针对这一变换,主板厂商和BIOS芯片厂商都作了相应的设计调整,各家的变化也不尽相同,加上资料缺乏,所以从细节讲解对于我来说有些困难。而基于8086的IBM PC的开机过程相对简单,可以参考的资料也比较多,所以就以它为例讲解一个完整的开机过程还是能说的比较明白的。(其实开机过程中技术含量最高的部分就是 BIOS中的例行程序了,BIOS代码虽短,但技术含量相当高,全世界仅有AWARD、PHOENIX、AMI、ACER等几家公司有研发BIOS系统的能力(AWARD 已被PHOENIX收购),其他主板厂商有的是直接购买,有的也会在以上几家公司提供的平台上进行少量功能扩展。作为个别应用的场合,就要完全靠自己对 BIOS进行改造。)

       下面就先笼统的说一下PC机的开机流程:
1.首先PC上电。

2.执行ROM BIOS例行程序进行硬件检测初始化,这其中如果主板上还插有其他适配卡,并且适配卡中ROM 芯片,那么BIOS例行程序会转去执行这些适配卡中的ROM芯片中的初始化例程,完了之后在返回BIOS例行程序中继续检测其他硬件。

3. BIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序。

4.引导程序开始负责操作系统初始化,然后起动操作系统。

这便是PC机的一个大致的开机流程;由于没有牵涉到细节问题,所以对于所以PC 机都是一样的。

下面我们就以8086的CPU为例详细讲解一下PC加电开机的过程:系统 BIOS是机器被加电之后首先被运行的程序。我们下面看一看一个典型的BootSequence所包含的步骤,当然,由于硬件BIOS厂商的不同,这些序列会有一些不同,但下面所列的,是你的主机被加电之后,通常都会发生的序列。

当机器被打开时,等电源稳定之后,电源会发送一个“加电成功信号”给芯片,以启动时钟生成器(8284);这是硬件设定好的,没有什么好解释的。
然后,CPU重新自设定为初试状态,开始准备运行。当CPU最初被启动的时候,系统RAM中是空的,没有任何内容可供执行。当然CPU设计者也知道这一点,所以他们对CPU进行了预先编程,以让CPU在这个阶段总是去查找系统 BIOSROM中的一个固定的位置,以启动BIOS BootProgRAM,这个位置为FFFF0h,用逻辑地址表示就是:F000:FFF0(也有的资料上面说是FFFF:0000),此时 CS=0xF000,IP=0xFFF0;这个位置也就是1M地址空间的最后16个字节的地方。既然FFFF0h到寻址结束的位置只有16个字节,所以这里不能放太多代码,只放置着一个Jump指令,以进一步跳转到真正的BIOS startup progRAM的位置,不同的BIOS厂商可以根据BIOS中代码的多少将其放在不同的位置,只需要通过Jump指定就可以了。好,现在我们可以看出这里面涉及到三个厂商:CPU制造商,BIOS制造商,主板制造商。这三方必须协调一致达成共识,首先CPU说:“加电后我就去FFFF0h执行第一条指令”,然后BIOS说:“好吧,那我肯定会把第一条指令放在FFFF0h,你能不能找到我就不管了”,这时候主板挺身而出说:“CPU大哥有我在你放心,只有你把FFFF0h放到地址总线上,我肯定让你找到BIOS中在FFFF0h处的那条指令。
好了,现在CPU找到了第一条指令,然后跳转到 BIOS的另一个地址去执行剩下的指令,那么剩下的指令是从哪里开始的呢?我们先看一下BIOS中程序的大概框架:

0xF000:0x0000:<------------The Last 64K Segment Base
        .
        .
        .
0xF000:0xXXXX:<-------------- BIOS Startup ProgRAM
        .
        .
        .
0xF000;0xFFF0:   jmp 0xF000:0xXXXX

这样安排的好处是,让BIOS的地址尽可能靠后,事实上 0xF000:0xFFF0离实模式的极限地址0xF000:0xFFFF只有16个字节了,也就安排得开一个跳转指令和其他几条简短指令。而我们实际究竟需要使用多长的启动代码由jmp 0xF000:0xXXXX中的偏移0xXXXX来把握,如果使用得多,0xXXXX就小,使用得少,0xXXXX就大,这样使启动代码尽量靠后,而不浪费多余的地址空间,由于地址空间安排在最后,也不会把整个地址空间隔离成两段。

然后BIOS开始实施Power-OnSelf Test(POST),在这个过程中,如果遇到任何错误,Booting处理就会结束,机器会被挂起。
第3步到第5步里面其实包括很多东西,只是由于缺少资料,仅有的少许资料说法又不一致,所以不做进一步细化。其中有一步操作说法还是比较一致的,那就是从c0000h开始,直到effffh结束。扫描依次检查2k的空间,查找后面跟55h和aah,这表示该地址有一个可选ROM。如果找到这样的ROM就会执行里面的程序对相应硬件进行初始化,执行完毕之后返回BIOS程序继续扫描。不过BIOS的这一扫描过程好像是针对当年的ISA总线的,如果根有55h和aah就表示这里有一个ROM,也是 BIOS设计中符合ISA模块协议的。至于现在ISA总线基本淘汰,多为PCI,VGA等总线类型,所以现在具体情况不清楚。至于为何从c0000h开始,到effffh结束扫描,这是当初IBM设计PC的时候作出的一个规定,它把最后的64K地址空间留给了BIOS,而把c0000h~effffh的地址空间留给了其他的适配卡,也就是其他的适配卡插到主板上以后肯定会被对应到c0000h~effffh区间的某一段地址,如果这个范围内插了适配卡那么即使这个范围内有实际的RAM,那么这部分RAM也就浪费了,因为寻址后访问的是适配卡,而不是RAM(相当于被短路了,或者说是屏蔽了),而如果这段地址区间内没有适配卡,那么这个地址区间内实际存在的RAM就可以被访问到了。
等着一些检测结束之后,BIOS会在系统屏幕上列出一个检测总结。
然后BIOS开始寻找一个启动设备,你可以通过配置BIOS来决定其搜索的顺序,这些设备包括Floppy Disk(A:),或者Hard Disk(C:),甚至还可以包括CD-ROM Driver或者其它设备。
当找到响应的启动设备之后,BIOS将会查找Boot信息以开始OS的启动过程。如果它找到了一个Hard Disk,它将会查找一个位于Cylinder 0, Head 0, Sector 1的Master Boot Record(硬盘的第一个扇区),如果它找到的是Floppy Disk,它也会读区软盘的第一个扇区。那么BIOS是如何知道第一扇区是否是引导扇区呢?是这样的,因为一个扇区是512字节,如果第一扇区的最后两个字节是0x55和0xAA那么这个扇区就是可引导的。
如果找不到任何启动设备,系统将会显示一条错误信息,然后冻结系统。如果找到了响应的启动设备,BIOS会将其第一扇区读到内存的7C00h位置,并跳转到那里执行它。此后,就由硬件启动阶段进入了OS启动阶段。
    总之,这个阶段有大量的事情要做,比如自检,初始化各种芯片,控制器,与端口;包括显示器,内存,键盘,软驱,串口等等;在这个过程中BIOS将检测到的硬件相关数据放置于0x00400~0x004FF之间的RAM,这个区域因此也被称为 BIOS Data Area(这里面的硬件参数可以供操作系统使用,使用BIOS中断对硬件进行操纵的时候相应的BIOS中断程序也要从这个区域取得硬件相关数据);同时还将中断向量以及BIOS程序运行所需要的Stack设置置于0到1K的RAM。最终,POST执行INT19h中断,找到可以启动的磁盘,将boot程序装入内存7C00h,并将控制权交给OS的boot程序。到此为止,那1M地址空间的布局情况如下:

0x00000-0x003FF:1K Bytes---中断向量表
 
0x00400-0x004FF:256 Bytes---BIOS数据区
 
0x00500-0x07BFF:---自由内存区
 
0x07C00-0x07DFF:512 Byetes—-引导程序加载区
 
0x07E00-0x9FFFF:---自由内存区
 
0xA0000-0xBFFFF:128K Bytes—-显示内存区
 
0xC0000-0xEFFFF:192K Bytes—-为其他可选适配卡预留区域
 
0xF0000-0xFFFFF:64K Bytes---BIOS
 

摘自:http://xianjunzhang.blog.sohu.com/21541107.html


  评论这张
 
阅读(362)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018