Board logo

标题: 问:电脑是怎么从ROM启动的... [打印本页]

作者: starsky     时间: 2004-8-4 00:00    标题: 问:电脑是怎么从ROM启动的...

不知道在这里问这个合不合适,问问先
就是开机电脑是怎么执行第一条指令的?按我猜想应该是第一条指令在初始ip所指的地址空间(记的motorola单片机就是这样 默认是ffff处开始)。但是疑问是:rom编址是不是和ram编在一起的?  
还有:大侠们能不能提供rom里面程序的相关资料和教程。电脑开机的过程太神气了,近来一直想弄明白
谢谢
作者: wchong     时间: 2004-8-5 00:00
我也想知道。
作者: starsky     时间: 2004-8-5 00:00    标题: 【转载】全面认识计算机启动过程---居然还是基础,晕~~


全面认识计算机启动过程
【 载自ChinaUnix】

  首先让我们来了解一些基本概念。第一个是大家非常熟悉的BIOS(基本输入输出系统),BIOS是直接与硬件打交道的底层
代码,它为操作系统提供了控制硬件设备的基本功能。BIOS包括有系统BIOS(即常说的主板BIOS)、显卡BIOS和其它设备(例
如IDE控制器、SCSI卡或网卡等)的BIOS,其中系统BIOS是本文要讨论的主角,因为计算机的启动过程正是在它的控制下进行
的。BIOS一般被存放在ROM(只读存储芯片)之中,即使在关机或掉电以后,这些代码也不会消失。
  第二个基本概念是内存的地址,我们的机器中一般安装有32MB、64MB或128MB内存,这些内存的每一个字节都被赋予了一个
地址,以便CPU访问内存。32MB的地址范围用十六进制数表示就是0~1FFFFFFH,其中0~FFFFFH的低端1MB内存非常特殊,因为
最初的8086处理器能够访问的内存最大只有1MB,这1MB的低端640KB被称为基本内存,而A0000H~BFFFFH要保留给显示卡的显存
使用,C0000H~FFFFFH则被保留给BIOS使用,其中系统BIOS一般占用了最后的64KB或更多一点的空间,显卡BIOS一般在
C0000H~C7FFFH处,IDE控制器的BIOS在C8000H~CBFFFH处。
  第一步: 当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU
发出并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行指令。当芯片组检测到电源已
经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的
Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号),CPU马上就从地址FFFF0H处开始执行指令,从前面的介
绍可知,这个地址实际上在系统BIOS的地址范围内,无论是Award BIOS还是AMI BIOS,放在这里的只是一条跳转指令,跳到系统
BIOS中真正的启动代码处。
  第二步: 系统BIOS的启动代码首先要做的事情就是进行POST(Power-On Self Test,加电后自检),POST的主要任务是检
测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。由于POST是最早进行的检测过程,此时显卡还没有初
始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),
那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。在正常情况下,POST过程进行得非常快,
我们几乎无法感觉到它的存在,POST结束之后就会调用其它代码来进行更完整的硬件检测。
  第三步: 接下来系统BIOS将查找显卡的BIOS,前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处,系统BIOS
在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡,此时多数显卡都会在屏幕上显示出一些初始化
信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之
后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。
  第四步: 查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版
本号等内容。
  第五步: 接着系统BIOS将检测和显示CPU的类型和工作频率,然后开始测试所有的RAM,并同时在屏幕上显示内存测试的进度,
我们可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式。
    第六步: 内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CD-ROM、串口、并口、软驱
等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。
  第七步: 标准设备检测完毕后,系统BIOS内部的支持即插即用的代码将开始检测和配置系统中安装的即插即用设备,每找到
一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。
  第八步: 到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其中概
略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。
  第九步: 接下来系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)。ESCD是系统BIOS用来
与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。通常ESCD
数据只在系统硬件配置发生改变后才会更新,所以不是每次启动机器时我们都能够看到“Update ESCD… Success”这样的信息,
不过,某些主板的系统BIOS在保存ESCD数据时使用了与Windows 9x不相同的数据格式,于是Windows 9x在它自己的启动过程中会把
ESCD数据修改成自己的格式,但在下一次启动机器时,即使硬件配置没有发生改变,系统BIOS也会把ESCD的数据格式改回来,如此
循环,将会导致在每次启动机器时,系统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因。
  第十步: ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作,即根据用户指定的启动顺序从软盘、硬盘或光驱
启动。以从C盘启动为例,系统BIOS将读取并执行硬盘上的主引导记录,主引导记录接着从分区表中找到第一个活动分区,然后读
取并执行这个活动分区的分区引导记录,而分区引导记录将负责读取并执行IO.SYS,这是DOS和Windows 9x最基本的系统文件。
Windows 9x的IO.SYS首先要初始化一些重要的系统数据,然后就显示出我们熟悉的蓝天白云,在这幅画面之下,Windows将继续进
行DOS部分和GUI(图形用户界面)部分的引导和初始化工作。
  如果系统之中安装有引导多种操作系统的工具软件,通常主引导记录将被替换成该软件的引导代码,这些代码将允许用户选择
一种操作系统,然后读取并执行该操作系统的基本引导代码(DOS和Windows的基本引导代码就是分区引导记录)。   
  上面介绍的便是计算机在打开电源开关(或按Reset键)进行冷启动时所要完成的各种初始化工作,如果我们在DOS下按
Ctrl+Alt+Del组合键(或从Windows中选择重新启动计算机)来进行热启动,那么POST过程将被跳过去,直接从第三步开始,另
外第五步的检测CPU和内存测试也不会再进行。我们可以看到,无论是冷启动还是热启动,系统BIOS都一次又一次地重复进行着这
些我们平时并不太注意的事情,然而正是这些单调的硬件检测步骤为我们能够正常使用电脑提供了基础。

[此贴子已经被作者于2004-8-7 12:16:32编辑过]



作者: wchong     时间: 2004-8-6 00:00
好!
作者: Climbing     时间: 2004-8-6 00:00
介绍的很详细也很准确,不查资料,单凭记忆很难描述的这么清晰明了。
作者: starsky     时间: 2004-8-6 00:00
我是从一个网站上帖过来的,肯定不是本人写的啦,忘了声明了~~
作者: wchong     时间: 2004-8-6 00:00
你有版权吗?
作者: Climbing     时间: 2004-8-6 00:00
是啊,转贴文章时最好给出原链接,这是对人家版权的尊重。
作者: starsky     时间: 2004-8-6 00:00
我习惯于把看到的好的资料保存下来,不习惯到处张贴,也就不在意原帖出处。这次只想贴出来给想看的人看一下,如果觉得不妥,我删掉好了
作者: Climbing     时间: 2004-8-6 00:00
呵呵,删掉就有点儿因噎废食了,还是再贴回来吧。只不过再贴回来时注明是转贴文章即可。

作者: 死性不改     时间: 2004-8-6 00:00
我的电脑里就没有一个软件是正版的,我的钱包不允许我“尊重”作者啊![em04]
作者: starsky     时间: 2004-8-7 00:00
好吧 再贴出来 ,听大家的。好像是从chinaunix载来的
作者: willsort     时间: 2004-10-2 00:00
Re All:

  Quote:
CPU马上就从地址FFFF0H处开始执行指令

关于此句我有些疑问,地址的概念似乎是针对RAM(内存)来说的,而BIOS代码指令在ROM(无论是否可擦写)中。而这个地址FFFF:0,据我所知,是ROM“映射”到RAM中的起始地址,而这个“映射”的过程肯定是在POST过程之后的,因为必须首先检测RAM的有效,才可能映射。也就是说,在POST之前地址FFFF:0应该是不存在的,那么CPU又怎么从此处开始执行呢?。
    关于显卡的BIOS也存在类似的问题,而且C0000也似乎并非“显卡BIOS”,我只知道早期的PC机中曾把它用作彩色显示器的屏幕缓冲区(640*480*16),而现在的显卡已不再如此使用。

[此贴子已经被作者于2004-10-2 13:51:36编辑过]



作者: aria     时间: 2004-10-2 00:00
嗯我觉得那是硬件连线决定的一开始并不存在映射,ffff:0实际上就是rom的区域
作者: cdl     时间: 2004-10-3 00:00
bios在4G空间的最高地址处,在实模式下无法直接读出bios,上电复位的第一条指令准确的说是放在FFFFFFF0H处,硬件实现译码,第一条指令是跳转指令,跳到真正入口处。bios的一部分代码是在rom中执行的,在没有测试ram之前,不可使用ram,可使用所有寄存器。VGA的显示缓存是a000:0000到b000:ffff,视频扩展bios是在c0000H到c7fffH。
作者: aria     时间: 2004-10-3 00:00
想问一下:既然不能用ram那么ss段是怎么设的呢?不能用call了吗?
作者: yzz163     时间: 2004-10-5 00:00
1。提供rom里面程序的相关资料和教程。------------------好象写BIOS的公司永远也不会提供的吧。2。一部分程序在ROM中运行,不能用ram---------------------------这样说,好象不妥吧?ROM是只读的,这句“一部分程序在ROM中运行”应改成“CPU将读取ROM中的代码”。
作者: aria     时间: 2004-10-5 00:00
1.我觉得不对.例如AMI就提供了一套sis芯片组的bios源码另外还有freebios,openbios等2.没有理解你的意思
作者: yzz163     时间: 2004-10-6 00:00


  Quote:
CPU马上就从地址FFFF0H处开始执行指令

关于此句我有些疑问,地址的概念似乎是针对RAM(内存)来说的,而BIOS代码指令在ROM(无论是否可擦写)中。而这个地址FFFF:0,据我所知,是ROM“映射”到RAM中的起始地址,而这个“映射”的过程肯定是在POST过程之后的,因为必须首先检测RAM的有效,才可能映射。也就是说,在POST之前地址FFFF:0应该是不存在的,那么CPU又怎么从此处开始执行呢?。
    关于显卡的BIOS也存在类似的问题,而且C0000也似乎并非“显卡BIOS”,我只知道早期的PC机中曾把它用作彩色显示器的屏幕缓冲区(640*480*16),而现在的显卡已不再如此使用。
-----------------------
以INTEL586为例,在复位信号结束后,南/北(具体要看芯片组)桥将使CPU发出读指令(第一条开机指令的第一总线周期),即CPU在自己的地址引脚上放:FFFF0。然后通过南/北、I/O芯片在BIOS的地址引脚上产生FFFF:0信号,BIOS的地址引脚A0-A7为低电平,BIOS被选中。BIOS将在自己的数据线引脚上放代码5B3AH(Award BIOS),I/O芯片、南/北将该数据传到CPU地址线上,最后由CPU读取并执行。
(通过短路ISA槽的A10 IO CHRDY和B10 GND脚可使CPU始终处于上述的“第一条读指令”状态,——其实就是读主板BIOS ROM里存放的第一条指令。这时你可测一下ISA的地址线A0-A19应全为高电平:1,即十六进制的FFFF)
这是我对CPU上电后如何读取BIOS指令的理解,也是我维修“致命故障”主板的理论依据。希望大家共同探讨。
“地址的概念似乎是针对RAM(内存)来说的”这不对吧?不管ROM、RAM对CPU来说都是一样的,即:通过地址线、数据线来访问他们的每个存储单元的。同样CPU访问其他设备也是一样的吧。当然ROM的“映射”要在后面来实现。
另外POST里好象要检查前64K内存吧?

[此贴子已经被作者于2004-10-6 12:23:20编辑过]



作者: yzz163     时间: 2004-10-6 00:00
aria:
1、你的BIOS原码是那个型号的主板上的,是实用的吗?能E-MAIL我吗?
2、ROM会运行程序???!!! 那CPU干什么?
所有的程序代码都是由CPU来执行的,RAM、ROM、只是放程序代码或数据的“容器”。

[此贴子已经被作者于2004-10-6 0:55:05编辑过]



作者: aria     时间: 2004-10-6 00:00
呵呵又学到了很多谢谢关于源码:那个是一本叫<<BIOS研发技术剖析>>里面的压缩后有6M多

[此贴子已经被作者于2004-10-6 12:29:01编辑过]



作者: cdl     时间: 2004-10-7 00:00


  Quote:
以下是引用aria在2004-10-3 16:16:20的发言:

想问一下:既然不能用ram
那么ss段是怎么设的呢?
不能用call了吗?

在对ram进行有效测试之前,不可以用ram。堆栈段是哪里并不重要因为不会用到,当然call是不能用的。可以使用所有的寄存器,寄存器默认是好的。
作者: cdl     时间: 2004-10-7 00:00
关键点:bios空间不在1M空间之内,光用20根地址线是无法访问的。正常情况下在实模式中是读不到bios的,就算你用ffff段也好。其实问题并不难,自己做个试验,把bios读出来看看不就知道了。如果能正确读出bios,fffffff0处一定是编码为EAH的转移指令。
作者: yzz163     时间: 2004-10-7 00:00
关键点:bios空间不在1M空间之内,光用20根地址线是无法访问的。正常情况下在实模式中是读不到bios的,就算你用ffff段也好。其实问题并不难,自己做个试验,把bios读出来看看不就知道了。如果能正确读出bios,fffffff0处一定是编码为EAH的转移指令。--------------------------"自己做个试验,把bios读出来看看不就知道了。"  你是在计算机正常启动后用程序读的?还是在CPU通电复位后用"专用硬件"(这时计算机还没完成自检)对BIOS进行单步跟踪的?
作者: cdl     时间: 2004-10-7 00:00


  Quote:
以下是引用yzz163在2004-10-7 15:42:55的发言:

关键点:bios空间不在1M空间之内,光用20根地址线是无法访问的。正常情况下在实模式中是读不到bios的,就算你用ffff段也好。其实问题并不难,自己做个试验,把bios读出来看看不就知道了。如果能正确读出bios,fffffff0处一定是编码为EAH的转移指令。
--------------------------
"自己做个试验,把bios读出来看看不就知道了。"  你是在计算机正常启动后用程序读的?还是在CPU通电复位后用"专用硬件"(这时计算机还没完成自检)对BIOS进行单步跟踪的?

我是编程把整个flash全读出来了。“专用硬件”我没用过。
作者: cdl     时间: 2004-10-7 00:00
关于bios映射到ram:bios映射到ram不是必须的,只是在rom中运行速度太慢。为了让执行速度更快而映射的,如果应用程序不是经常调用bios的话,没必要映射到ram空间,这样可以节省ram资源。特别是用windows操作系统的用户根本就没必要映射,因为bios的基本功能都是实模式代码,保护模式无法使用,windows下的硬件驱动都是重新加载的,不会使用bios的功能。
作者: yzz163     时间: 2004-10-12 00:00
我是编程把整个flash全读出来了。------------------你是在计算机启动后在用程序读BIOS的吧?这时BIOS应该是被映射到内存里了把,不同的操作系统可能被映射的地址不同吧?但现在我们讨论的是在CPU复位后的第一条指令:即如何读取BIOS的.
作者: yzz163     时间: 2004-10-12 00:00
bios空间不在1M空间之内,光用20根地址线是无法访问的。-----------------------------对于X86系列的CPU,在复位后,就工作在X086模式即"实模式",这时它只能用20根地址线.当然对于其他类型的CPU可能不同.
作者: cdl     时间: 2004-10-12 00:00
在286之前地址空间是20位的,只需要16位的段寄存器和16位的IP就够了,而286的地址空间是24位的,386的地址空间是32位的,地址产生方式与286之前的CPU有很大的区别。在386以后的计算机中,BIOS是放在最高地址空间的64K处,第一条指令是在FFFFFFF0处,CPU复位后第一条指令并不是由CS左移4位+IP计算地址的,虽然复位之后cs=FFFFH,但是CPU产生的第一条指令的地址和它毫无关系。基址是由另外一个寄存器(该寄存器无法直接访问)产生,CPU复位后该寄存器的值是确定的并保证由该基址和EIP=0000FFF0H,寻址到FFFFFFF0H处,第一条指令是长跳转指令,执行第一条指令后cs重新装入,同时基址寄存器也重新装入。
作者: beiyuly     时间: 2006-10-13 20:59


  Quote:
Originally posted by willsort at 2004-10-2 00:00:
Re All:
   
    关于此句我有些疑问,地址的概念似乎是针对RAM(内存)来说的,而BIOS代码指令在ROM(无论是否可擦写)中。而这个地址FFFF:0,据我栮..

bios在进行ram shadow之前,cpu的指令是从bios om中拿到的,那个时候没有ram,也就是说机器还不知道有ram,只有在进行ram shadow之后,才会在ram中放入印象,这才从ram中的指令执行.
作者: beiyuly     时间: 2006-10-13 21:07


  Quote:
Originally posted by cdl at 2004-10-7 00:00:
关于bios映射到ram:bios映射到ram不是必须的,只是在rom中运行速度太慢。为了让执行速度更快而映射的,如果应用程序不是经常调用bios的话,没必要映...

不同意你的理解

bios的代码中只有刚开始的一部分不需要桟的.
如果继续下去,bios中的大部分功能实现是需要桟的支持,哪怕他是在实模式下.
所以你说ram不是必须的我不同意.

虽然windows有了他自己的驱动,但是它还是要由bios来引导,目前计算机的体系机构就是这样的,除非微软自己写一个东西来引导他自己的操作系统.
作者: jipinshangren     时间: 2008-8-17 17:13
很好,脑袋里面有了新东西!谢谢!