前言
本文是我在学习操作系统在启动章节的一些理解、查阅了一些资料,做的一个总结。不会很深,目的是为了树立起一个操作系统启动的宏观过程。
随便聊聊
我们在入职新公司的时候,第一件事就是安装系统。有的是有IT帮忙搭建,但是像我们使用Linux作为自己的主机系统,装系统这种活通常都是自己干。在安装系统的过程中,我们往往就会或多或少积累到一些启动方面的知识。比如选择u盘启动还是光盘启动,都是要进bios里面选择boot的启动选项,设定合适的启动顺序;比如我们自己的主机配置不行,cpu太差,内存不够,在有更好的主机可以用的话,我们往往把硬盘拔下来换到另外一个高配置上的主机上,电脑启动之后,原来的系统又会重新启动,一点不受影响。这里就涉及到诸如BIOS,硬盘等知识与计算机的启动密切相关。
系统启动
我们的计算机在被按下电源的那一刻,经历了cpu、bios、bootload等主要步骤的启动流程。下面是启动的流程图。
下面将对上面的几个流程进行简单剖析:
电源开关按下
电源开关按下后,电源将会计算机的各个电子元器件进行供电。首先做出反应的是主板上的芯片组,它将会向cpu发送一个RESET(重置信号),请求cpu开始初始化。当检测到电源开始稳定供电
的时候,RESET信号将会被撤走。
CPU寻找BIOS
在cpu的初始化的过程中,它会CS寄存器置位0xffff,其他的寄存器置位0x000。这样它便开始寻址CS:IP 0xffff:0x0000的位置(cs: 段寄存器, ip: 指令寄存器),这个位置正好存放着跳往bios地址的跳转指令。按照这个步骤,cpu便能找到bios(基本I/O处理系统),并把控制权交给它。
BIOS的加电自检
bios是固化在主片上的ROM芯片里面的一个程序。它从cpu那里拿到控制权之后,便开始了自我检查。检查一下显卡、内存等关键硬件是否能正常运行。否则蜂鸣器会警告。这里举个例子,我以前给设备加内存条,电源一插上,蜂鸣器便拼命的叫。吓我一大跳,我连忙把电源拔了。而后检查了一下,发现是内存没插好,重新弄了一下,便正常了。
寻找BOOTLOAD
bios自检结束,将会开始搜索这个计算机上面可用的第一个主引导扇区(一般搜索顺序是我们在bios里面的boot的启动顺序设置的)。找到它之后,将会把bootload从硬盘里面读入到内存中的一个特定位置(以x86为例,地址是0x7C00)。完成之后便会寄存器指向这个地址,到这里,控制权从bios交接给了bootload。
bootload是一个用来引导操作系统的一小段程序。一般位于硬盘的第一个扇区,很小512个字节。正因为它很小,所以它实现的功能也很有限,主要就是起到一个从disk拷贝os到memory的一个作用。
BOOTLOAD引导OS
bootload被加载到内存之后,它便开始去寻找操作系统。主要是找到硬盘的起始扇区、硬盘中操作系统的起始扇区和操作系统的长度,然后将这个操作系统读写到内存中。将cpu控制权交给os, 就是去执行操作系统中的第一个地址。后面操作系统便开始正常工作,后面操作系统的启动工作在这里不做详述。
看到这里,我想计算机的启动简单的来说就是,插上电源-自我检查-拷贝os-运行os。看起来很简单,但是其内部实现需要硬件和软件的共同努力和智慧,才能保证每一次计算机都可以正常启动。