• 鬼斧神工---计算机的开机启动过程



    一.层层迭代的悖论

     

    我们知道计算机是通过一系列指令,程序控制着各部件在操作系统的管理下有条不紊地执行的。但是我们却很少了解到计算机开机的过程,其实计算机开机是一个十分负责却十分巧妙的过程。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!有一句谚语叫做”pull oneself up by one’s bootstraps” 字面意思是“自己用鞋带把自己拉起来”就生动诠释了这个有趣的问题。这也就是计算机术语中的“启动”取名“boot”的由来。

     

     

    二.扫榻相迎(操作系统启动前)

     

     

    任何事都不是一蹴而就的。在计算机电源接通之后操作系统并不是马上运行的哦。如果将操作系统比作计算机的贵宾,那么在计算机正式启动之前,为了迎接“客人”进驻,需要做好哪些准备工作呢?

     

     

    a) 按下电源开关,电源就开始向主板和其它设备供电;当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号)CPU马上就从地址FFFF:0000H 处开始执行指令,放在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。

     

    b) 系统BIOS的启动代码首先进行POST(PowerOn Self Test,加电后自检)POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型;在正常情况下,POST过程进行得非常快,几乎无法感觉到它的存在。POST结束之后就会调用其它代码来进行更完整的硬件检测。

     

    c) 接下来系统BIOS将查找显卡的BIOS。前面说过,存放显卡BIOSROM芯片的起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡。此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。

     

    d) 查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容。

     

    e) 接着系统BIOS将检测和显示CPU的类型和工作频率,测试所有的RAM,并同时在屏幕上显示内存测试的进度。可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式。

     

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

     

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

     

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

     

    i) 接下来系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。通常ESCD数据只在系统硬件配置发生改变后才会更新,所以不是每次启动机器时都能够看到“Update ESCDSuccess”这样的信息。不过,某些主板的系统BIOS在保存ESCD数据时使用了与Windows 9x不相同的数据格式,于是Windows 9x在它自己的启动过程中会把ESCD数据修改成自己的格式。但在下一次启动机器时,即使硬件配置没有发生改变,系统BIOS也会把ESCD的数据格式改回来。如此循环,将会导致在每次启动机器时,系统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因。

     

    j) ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作:即根据用户指定的启动顺序从软盘、硬盘或光驱启动MBR。在这个过程中会按照启动顺序顺序比较其放置MBR的位置的结尾两位是否为0xAA55,通过这种方式判断从哪个引导设备进行引导。在确定之后,将该引导设备的MBR内容读入到0x7C00[1]的位置,并再次判断其最后两位,当检测正确之后,进行阶段1的引导。

     

    至此,操作系统启动之前的所有启动步骤都完成了,如果从硬盘启动的话,接着就是操作系统的启动过程了。

     



     

     

     

     

    三.虎符交接(操作系统内核的加载)

     

    当一切准备就绪后,接下来就轮到操作系统这一主角粉墨登场了。我们需要把控制权交给操作系统掌管,而操作系统的内核是首先被载入内存的,实现这个载入功能的程序叫做Loader

     

    1.Loader 程序的执行过程

    Loader 程序的任务和 Boot 程序很相似,同样是将其它的程序加载到物理内存中,这次加载的是操作系统(EOS)内核。除此之外,Loader 程序还负责检测内存大小,为内核准备保护模式执行环境等工作。

    简单来说,Loader程序就是从软盘的根目录将内核文件kernel.dll载入物理内存0x10000,然后通过开启分页机制,映射到虚拟地址0x80000000处,然后Loader程序跳转到kernel.dll的入口点继续执行,到此,控制权交给了内核。

     

    2.内核初始化过程

    Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。

     

    然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。至此,全部启动过程完成。

    总的来说,内核初始化的主要是初始化处理器和中断、各个管理模块、最后创建主进程。之后启动控制台程序,这样就可以交互,进行应用程序的执行了.

     

     

    以上就是计算机从按下电源键后发生的一切幕后的“神秘过程”。显而易见,这是一个相当复杂的控制过程。其实,无论是计算机领域,还是现实世界中,从简单到复杂就是一个恒定的规律。一条条具体的指令,经过有智慧的排列组合,形成了功能强大,令人赞叹的计算机系统;一个个细胞,经过有条不紊的分工合作,组成了富有活力,多姿多彩的智慧生命体;甚至一个个“小小的”星球,在周而复始,按部就班的运行下,才构成了浩瀚无垠的广袤星系...... 混沌的万物其实只是表象,只要经过智慧的设计,就如同操作系统的启动过程一般,就会让“繁杂无序”的许许多多细节拼接成“稳定有序”的流程,让混沌变得和谐,让杂乱无章的衰败成为井井有条的美好。

  • 相关阅读:
    jni java与c++交互返回三维数组jobjectArray
    Android开发之EditText 详解(addTextChangedListener监听用户输入状态)
    Android JNI和NDK学习(09)--JNI实例二 传递类对象
    JavaDoc的生成规则---ShinePans
    Android 电话自己主动接听和挂断具体解释
    传统线程技术(一)
    Linux内核启动及根文件系统载入过程
    eclipse、MyEclipse实现批量改动文件编码
    菜鸟开发—应具备的搜索技巧
    Java之GUI编程(一)
  • 原文地址:https://www.cnblogs.com/linruier/p/9485199.html
Copyright © 2020-2023  润新知