posts - 381,  comments - 0,  trackbacks - 0

以下内容基于x86平台分析讲解。

操作系统直接运行于硬件之上,用于控制与管理计算机的硬件与软件资源,并且为应用层的软件开发提供服务和接口,现在的计算机大概架构如下所示:

硬件就是主板、显示器、键盘、鼠标等我们来重点看一下BIOS,BIOS全称为Base Input & Output System,也即基本的输入输出系统,BIOS是计算机上电后第一个运行的程序,BIOS固化在一个专用的芯片ROM中,因此,BIOS程序称为固件程序,我们暂且认为它是不可改变的,出厂后就已经固化了,而要让一个计算机运行起来,必须要给硬件配置配置一些基本的参数,这些参数存储在CMOS芯片中,这个芯片由外部电池供电,其中的参数也是可以修改的。

存储BIOS程序的ROM的映射地址区间为:0xF0000 - 0xFFFFF,而BIOS程序的入口地址为0xFFFF0,由于硬件的特殊设计,加电后,程序就从0xFFFF0处开始执行,也即开机就运行BIOS程序。

下面开始进入BIOS的运行过程:

  计算机加电后,BIOS程序开始执行,它先检测各种硬件的状态,如内存条是否插好,硬盘是否插好等,只有那些维持计算机运行的硬件具备了,BIOS才会继续向下运行,例如,内存条没有插好,这时的计算机可谓缺胳膊少腿,这时BIOS是不会向下运行的,因为没有内存就根本不会维持计算机的运行,因此BIOS也没有向下运行的必要了。由于我们研究的主要内容是操作系统,所以我们暂且不关心硬件,认为它是完备的。BIOS完成硬件的检测后,就将CMOS芯片中存储的参数配置到各种硬件中,这时整个系统才算基本正常,下面BIOS继续运行,它在内中的特定地址上建立中断向量表,这些中断向量可以认为是一系列的函数,这些函数提供了访问硬件的手段,我们自己写的软件“调用”这些函数即可,这里的“我们自己写的软件”可以认为是裸机程序,也是非常底层的程序,而这里的“调用”方法也比较特殊。接下来,BIOS要完成一项更重要的使命--加载主引导程序,它按照用户的设置,去扫描整个系统中的各个存储介质(光驱、软驱、USB、硬盘等),当发现主引导程序后,便将其加载到内存的0x7c00的位置处,然后将控制权交给主引导程序,至于为什么是加载到0x7c00处,可以认为这是x86系统的约定。到此为止,BIOS的使命也就完成了。

  以上讲了BIOS加载主引导程序的故事,但是BIOS是怎么找到主引导程序的呢?主引导程序位于存储介质的主引导区(MBR:Master Boot Record),它位于存储介质的开头处,总的大小为512字节,而最后两个有效字节为0x55aa,BIOS就是通过判断这最后两个字节是不是0x55aa来确定主引导区的,位于0x55aa之前的那些程序就是主引导程序了。

  主引导程序也有自己的使命,它先进行一些软件的初始化,例如将CPU内的一些寄存器写入合适的值,然后主引导程序开始加载操作系统内核,并最终将控制权交给内核,而内核将完成更细致的系统初始化,然后就可以开始运行真正的用户程序了,到此为止,整个系统就运行起来了。

整个系统的启动流程可以总结为下图:

 

本文参考狄泰软件学院操作系统教程以及个人的理解,错误之处欢迎留言指正,望不吝赐教。

posted on 2018-06-12 21:28  周伯通789  阅读(...)  评论(...编辑  收藏