计算机的启动过程
计算机总是和我们的硬件打交道,再了解计算机的启动过程之前,先来了解计算机关于启动不可或缺的硬件设备 - 「主板」 。
主板,也称为 母板 、 双亲板 ,它是计算机最基本也是最重要的部件之一。每台计算机上都有一块主板,主板一般为矩形电路板,上面安装了组成计算机的主要电路系统,一般有 BIOS芯片 、 I/O控制芯片 、 键盘、面板控制开关接口 、 指示灯查接件 、 扩充插槽 、 主板及插卡的直流电源供电接插件 等元件。
BIOS (Basic Input Output System) ,是主板上的一个应用程序,主要负责 开机(硬件)自检 、 启动顺序 。在 BIOS 内有底层I/O软件,包括 读取键盘输入 、 输出信息到屏幕终端 、 磁盘I/O 等, BIOS 程序运行中产生的数据被保存在 非易失性的闪存 中,当 BIOS 中出现错误指令时,可以有操作系统进行更新。
开机自检 :计算机 启动(booted) 时,BIOS作为按下计算机上运行的第一个程序,它会首先检查计算机上的RAM数量,键盘和其他基础设备是否已安装并可以正常工作,若检测到有非正常工作的 RAM 或其他元件时,则会在启动过程中报错。
接着,BIOS会开始 扫描PCIe和PCI总线 并找到对应接在主线上的设备,/* 一些热插拔的设备也会在这个过程中被记录下来。*/ 如果出现于上一次启动中不同的设备,则新的设备将会重新配置。
然后, BIOS 通过尝试存储在 CMOS (Complementary Metal Oxide Semiconductor, 互补金属氧化物半导体) 存储器中的设备清单并尝试启动设备。 CMOS 是位于电脑主板上的一块可读写的 RAM芯片 ,在电脑主板上用来保存BIOS设置完电脑硬件参数后的数据。
启动顺序 :硬件自检完成后,BIOS会把控制权交给下一阶段的启动程序。这时,BIOS需要知道下一阶段会运行什么程序,以便将控制权限交给对应的程序。BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备,这种排序称为 启动顺序(Boot Sequence) 。
一般来说,硬件自检完成后,BIOS会判断当前是否能够从外部 CD_ROM 和 USB 驱动程序启动,如果没有外部设备,系统将从 硬盘启动 ,此时, boots 设备的第一个扇区被载入内存中并执行。该扇区包含一个可以确定引导扇区末尾的分区表中的哪个分区处于活动状态,然后从该分区读入第二个启动加载程序,该加载器从活动分区中读取操作系统并启动。
接着,操作系统会询问BIOS获取配置信息。对每个设备来说,会检查是否有驱动程序,当发现设备驱动程序后,操作系统会将驱动程序加载到内核中,然后初始化表,创建所需的后台进程,并启动登录程序或GUI。
BIOS按照 启动顺序 ,把控制权交给排在第一位的储存设备。即根据用户指定的引导顺序从 软盘 、 硬盘 、 外部存储(USB, CD_ROM) 等设备中读取启动设备的 主引导记录(Master Boot Record, MBR) ,并放入指定位置的内存中。这是,计算机读取该设备的第一个扇区 / 一个标准扇区为512 bytes / ,如果该扇区的最后两个字节是 0x55 和 0xAA ,则表明可以从该设备启动;如果不是,表明该设备无法用于启动系统,此时控制权会交给 启动顺序 中的下一个设备。
主引导记录 :主要用于告诉计算机到硬盘的哪个位置去找操作系统。
这一阶段计算机会根据读取到的 主引导记录 启动操作系统,目前最常使用的启动方式为通过运行 启动管理器(Boot Loader) 由用户自行决定选择哪一个操作系统启动。
Linux环境中,最流行的启动管理器是 GRUB (GRand Unified Bootloader ) ,主要功能是在启动时从BIOS接管掌控、加载自身、加载内核到内存、再把执行权交给内核。
控制权转交给操作系统后,操作系统的内核首先被载入内存。
在Linux操作系统中,首先通过加载 /boot 目录下的 kernel 文件。内核文件加载成功后,接着运行操作系统上的第一个程序 /sbin/init ,该程序运行后会产生Linux操作系统中的第一个 init 进程,该进程 pid 为1。最后, init 进程加载系统的各个模块,驱动程序,直到执行 /bin/login 程序,出现终端或GUI界面。