正文

[zt]计算机的工作原理和流程2007-12-02 11:20:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ljqy/31229.html

分享到:

引导过程

我们几乎每天都要打开电源启动机器,面对屏幕上出现的一幅幅启动画面,我们一点儿也不会感到陌生,但是,计算机在显示这些启动画面时都做了些什么工作呢?

打开计算机机电源后到计算机准备接受你发出的命令之间计算机所运行的过程称为引导(Boot)过程。我们知道,当关闭电源后,RAM的数据将丢失,因此,计算机不是用RA来保持计算机的基本工作指令,而是使用另外的方法将操作系统文件加载到RAM中,再由操作系统接管对机器的控制。这是引导过程中的一个主要部分。总的说来,引导过程有下面几个步骤:

加电––––打开电源开关,给主板和内部风扇供电。

启动引导程序––––CPU开始执行存储在ROM BIOS中的指令。

开机自检––––计算机对系统的主要部件进行诊断测试。

加载操作系统––––计算机将操作系统文件从磁盘读到RAM中。

检查配置文件,定制操作系统的运行环境––––读取配置文件,根据用户的设置对操作系统进行定制。

准备读取命令和数据––––计算机等待用户输入命令和数据。

(
) 加电

引导过程的第一步就是通电。电扇开始运转,电源指示灯应该变亮,否则说明系统电源供应有问题,或是主板等部件和机箱发生短路。

(
) 启动引导程序

CPU
是从内存地址FFFF0H处开始执行指令的,从前面的介绍可知,这个地址实际上在系统BIOS的地址范围内,无论是哪家公司的 BIOS,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。

(
) 开机自检

系统BIOS的启动代码首先要做的事情就是进行POSTPowerOn Self Test,加电后自检),POST的主要任务是检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误。正常情况下,POST过程进行得非常快。

POST
结束之后,系统BIOS将查找显卡的BIOS并调用它的初始化代码,由显卡BIOS来初始化显卡,此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容。系统BIOS接着会查找其他设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。

查找完所有其他设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括系统BIOS的类型、序列号和版本号等内容。然后检测和显示CPU的类型和工作频率,然后开始测试所有的RAM,并同时在屏幕上显示内存测试的进度。

内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CDROM、串口、并口、软驱等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。

标准设备检测完毕后,系统BIOS内部支持即插即用的代码将开始检测和配置系统中安装的即插即用设备,每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。

经过上面几步,所有硬件都已经检测配置完毕,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。

接下来系统BIOS将根据CMOS配置更新ESCDExtended System Configuration Data,扩展系统配置数据),ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段。通常ESCD数据只在系统硬件配置发生改变后才会更新,所以不是每次启动机器时我们都能够看到“Update ESCD… Success”这样的信息。

(
) 加载操作系统

POST成功之后,系统BIOS的启动代码将进行它的最后一项工作,即根据用户指定的启动顺序从软盘、硬盘或光驱启动,定位并加载操作系统文件。首先计算机查找两个操作系统文件:Io.sysMsdos.sys。如果这两个文件不存在,引导过程会显示如下信息:“Non-system disk or disk error”或者“Invalid system disk”

提示:如果设定的启动顺序是先软盘后硬盘,出现上述提示时要检查一下软驱中是否放的是系统盘(包含上述系统文件)。如果不是系统盘,可将软盘取出,在按任意键后,计算机将从下一个驱动器(硬盘)查找系统文件。

然后,微处理器将试图加载另外一个操作系统文件Command.com。如果加载失败(Command.com文件不存在或版本不对),会出现故障信息:“Bad or missing command interpreter”,而且你发出的所有命令计算机都无法执行,因为Command.com是专门用来解释这些命令的。

(
) 检查配置文件并定制操作系统的运行环境

在引导过程初期,计算机通过检查CMOS中的信息对硬件作初始化等工作。但具体到不同的操作系统中,计算机还需要更多的配置信息来正确使用所有的设备并创建个性化的运行环境。

我们以DOSWindows两种常用的PC操作系统为例,在DOS中我们常通过创建并编辑Autoexec.bat文件实现开机后自动执行某些命令,比如设置硬盘缓冲区大小、自动启动汉字环境等;在另一个文件Config.sys中可以加载鼠标、光驱、声卡等设备的DOS驱动程序等,使在DOS中可以使用这些设备。在Windows中对运行环境进行配置的方法更多,比如修改注册表,编辑System.iniWin.ini等系统配置文件,或将希望启动完Windows后立即执行的内容放入Windows的启动(Startup)组中。

(
) 准备接收命令和数据

当计算机准备好接收命令时就结束了引导过程。通常在引导结束后,计算机会显示操作系统的屏幕或提示符。如果你使用的是Windows,那么就会看到Windows的桌面;如果使用的是DOS,就会看到操作系统提示符(如C:\>A:\>等)。

上面介绍的整个过程便是计算机在打开电源开关(或按Reset键)进行冷启动时所要完成的引导工作。如果我们在DOS下按CtrlAltDel组合键(或从Windows中选择重新启动计算机)来进行热启动,那么POST过程将被跳过去,另外检测CPU和内存测试也不会再进行。我们可以看到,无论是冷启动还是热启动,系统BIOS都一次又一次地重复进行着这些我们平时并不太注意的事情,然而正是这些单调的步骤为我们能够正常使用电脑提供了基础。

 

 

 

  下面就说一说你的疑问:  
  1.  
系统开机进入加电自检(POST)时,所有需要占用内存地址空间的适配器(比如显卡)都是非使能的(这是设计规范要求的),所以不存在把显存之类的映射存储器认成内存的情况。  
 
处理器自测试之后进入ROM   BIOS的初始化部分,它首先检测1MB地址的常规内存,注意此时显卡还没有启用,所以检测到内存错误只能用PC喇叭报警(有些主板支持LED显示),然后它检测/初始化显卡,显卡启用之后(有问题的话也是PC喇叭响了),再进行1MB以上地址的扩展内存检测。  
  2.  
至于慢不慢呢,你自己开机看一下不就知道了。:)  
 
开机时显卡的版本信息之类的显示之后,有一个停顿,这就是在自检内存(1MB以上地址),一些老机器还会动态显示自检的内存数量。  
 
在以前的老机器上,自检8MB内存都要好几秒呢。现在的双通道DDR/DDR2,自检1GB也不会超过2秒(如果CMOS设置中的Quick   POST禁用的话,要慢一些,因为要进行写-读测试三次)。  
   
 
再说说你的意见:  
  1.   SPD
 
 
以前的内存条根本就没有SPD,而且即便现在的内存条,把存储SPDEEPROM芯片去掉也照样可以用。事实上在CMOS设置中可以忽略SPD的数据,手工设置参数(频率、CL、预充电时间等等)。  
 
所以这一条显然不成立。  
   
  2.  
内存控制器。  
 
内存控制器根本不关心连接了多少内存,它只是控制产生地址、锁存数据、刷新信号等等。  
 
也就是说它只对地址线、数据线、控制线进行操作。一个明显的例子就是读写不存在内存的物理地址不会产生任何错误。

 

  1。获得内存大小  
 
这个现在的系统都是通过spd和其他一些北桥的寄存器算出来的。而不是靠读写内存试出来的。  
   
  2
。检测内存  
 
检测内存无非两种方法,   硬件检测(由芯片组提供),软件检测(就是你说的WRV的过程)。  
 
硬件检测很少见,所以主要靠软件。内存检测不一定要发生在刚刚开机的时候,尤其是现在bios的实现都很灵活,   所以检测之前肯定有很多内存空洞,检测开始之前要计算出空洞的列表,   跳过去。其次,读写的时候不可能每个字节每个字节的读,否则速度太慢,所以即使你没有开Quick   Post,也已经是在跳着读写了,那么就是说内存检测实际上并非我们想的那么准确。但是大多数情况下,即使跳着测试也已经能够反应问题了。在特殊的诊断模式下,软件会每个字节的读写,但是大多数人肯定不愿意这样漫长的等下去。所以,2秒钟测完1GDDR2内存基本是不可能的。  
   
  3
。检测内存的可靠性  
 
实际上即使每个字节读取,内存检测结果的可靠性仍然要打折扣,由于在系统中多个地方存在cache,即使你认为你写了检测的pattern进去,可能也只是在缓存里面,而很多cache你根本没有办法flush   再说,   真的能flush,你检测内存的时间就会更长,因为flush是个很耗时的操作。  
   
  4
。内存控制器  
 
内存控制器不是只有硬件的接口还有软件的接口,芯片组会提供很多寄存器来告知内存的参数和状态。同时你也可以通过这些寄存器来设置内存工作模式(比如自动patrolECC错误门限)。因为现在内存控制器一般集成在北桥,所以北桥又叫MCHMemory   Controller   Hub)。

 

1.   你现在怎么又说软件检测了?  
   
  2.  
按你那么说,没有SPD的内存条系统就不知道内存大小了?  
   
  3.  
谁说要字节操作呢?在16-bit处理器上都可以字操作,32-bit处理器上进行双字读写不是很快吗?  
   
  4.  
双通道DDR   400/DDR2   533的带宽是多少?你为什么说2秒检测不完呢?你写过测试吗?  
   
  5.  
我有源代码啊,在ACPIPOST.ASM中,你如何解释它的检测方法?:)  
   
 
xor ax,ax  
  mov ds,ax ;segment   at   0  
   
  ;save   data   to   avoid   destoried   by   memory   sizing   due   to   wrap-around  
  push dword   ptr   ds:[0FFF8H]  
  push dword   ptr   ds:[0FFFCH]  
   
  ;write   a   pre-defined   pattern   to   check   wrap-around  
  mov dword   ptr   ds:[0FFF8H],12345678H  
   
  mov ax,G_RAM  
  mov ds,ax  
   
  ; Go   into   protected   mode...  
   
  call Enable_Prot_Mode ;   enable   protected   mode  
  jc Exit_Mem_Sizing  
   
  ; Size   extended   memory   from   1Mb  
   
  xor eax,eax  
  mov ax,10h  
  p48_62:  
  mov esi,TEST_INDEX  
  add esi,GDT_LOC  
  mov byte   ptr   ds:[esi+HIBASE+20000h],al  
  mov byte   ptr   ds:[esi+MSBASE+20000h],ah  
   
  mov si,TEST_INDEX  
  mov es,si ;   es   =   test   segment  
   
  mov dword   ptr   es:[0fff8h],0   ;   write   data   to   memory  
  mov dword   ptr   es:[0fffch],eax ;   flush   bus  
   
  cmp dword   ptr   ds:[0fff8h],   12345678h  
  jne short   P48_64  
   
  cmp dword   ptr   es:[0fff8h],0   ;   memory   exist?  
  mov dword   ptr   es:[0fff8h],0   ;   clear   offboard   latches  
  jne short   p48_64 ;   end   of   memory  
   
  mov dword   ptr   es:[0fff8h],0ffffffffh   ;   write   data   into   memory  
  mov dword   ptr   es:[0fffch],eax   ;   flush   bus  
  cmp dword   ptr   es:[0fff8h],0ffffffffh   ;   memory   exist??  
  mov dword   ptr   es:[0fff8h],0ffffffffh   ;   clear   off   board   parity   latches  
  jne short   p48_64   ;   jump   if   no   more   mem   found  
   
  mov dword   ptr   es:[0fff8h],0     ;   write   data   into   memory  
  mov dword   ptr   es:[0fffch],eax   ;   flush   bus  
  cmp dword   ptr   es:[0fff8h],0     ;   memory   exist??  
  mov dword   ptr   es:[0fff8h],0     ;   clear   offboard   parity   latches  
  jne short   p48_64   ;   jump   if   no   more   mem   found  
   
  p48_623:  
   
  inc ax ;   increment   64k   mem   count  
   
  ifdef MAX_DRAM_SIZE  
  cmp ax,MAX_DRAM_SIZE ;   DRAM   size   limit  
  else; MAX_DRAM_SIZE  
    cmp ax,MAX_MEM_SIZE*4*4 ;   (400H*16)     1Gb   yet?  
  endif; MAX_DRAM_SIZE  
   
  jae short   P48_64 ;   test   only   up   to   256Mb  
  jmp p48_62  
   
  ; Enable   parity  
   
  p48_64:  
   
  ; Save   amount   found  
   
  sub ax,10h ;   ax   =   no.   of   64k   chunk   above   1M  
  shl eax,6 ;   change   to   1K  
  mov EXT_MEM_SIZE[bp],eax ;   save   memory   found  
  cmp eax,0ffffh ;   over   64Mb  
  jbe short   @F ;   No.  
  mov ax,0ffffh ;   set   65535Kb   max.  
  @@:  
  and ax,0FFC0h  
  mov cx,ax ;   save   orginial   size  
   
  ; Write   information   to   the   screen...  
   
  p48_65:  
  call Shutdown_From_Mem_Test ;   back   to   real   mode...  
   
  F000_call Ct_Ext_Mem_Limit ;   limit   extended   size  
   
  mov EXT_MEM_FOUND[bp],ax ;   save   amount   of   memory   found   in   CMOS  
  cmp cx,ax  
  je short   @F ;   extended   size   changed  
  xor ecx,ecx  
  mov cx,ax  
  mov EXT_MEM_SIZE[bp],ecx ;   save   memory   found  
  @@:  
   
  ; Display   amount   of   memory  
   
  mov dx,EXT_MEM_FOUND[bp] ;   get   the   found   amount   of   ext.   memory  
  mov EXT_MEMORY[bp],dx ;   set   value

阅读(3098) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册