计算机系统启动过程分析

目录

1 简介

本文是2011年博客的重新整理。之前的博客参考CSDN

关机状态按下计算机开关时,硬件使能电源(PSU)引脚,电源DC输出打开。DC输出稳定后,电源向主板发出Power Good信号。主板时钟芯片收到Power Good信号后,向CPU发出reset 信号。CPU检测到复位信号后,设置某些寄存器为特定值,其中寄存器CS和IP被预置为 CS:IP=0xF000:FFF0,并让CPU在实模式下运行,可知CPU将执行地址0xFFFF0处代码。硬件电路把地址0xFFFF0映射到ROM中,这个地址包含一条JUMP指令,将跳转到真实的ROM BIOS(Basic Input/Output System)处开始执行BIOS代码。BIOS例程完成通电自检 (POST,Power-on-self-test)、硬件初始化、读取CMOS配置,并提供一组中断驱动的低级过程供操作系统启动时使用。BIOS初始化完成后,将搜索一个操作系统来启动,按照用户配置,这个过程试图访问软盘、光盘、磁盘、USB、FLASH等存储芯片。在找到一个有效设备后,BIOS把该设备主引导记录(MBR,或者称作分区扇区,是0柱面 0磁头1扇区,LBA下称为0扇区,512字节)的内容拷贝到RAM中物理地址为0x7C00的位置,然后跳转至CS:IP=0x0000:0x7C00执行来自MBR的代码。一个有效设备MBR中最后两个字节的值为0x AA 55。MBR分为三部分,分别是指令代码、分区表DPT (Disk Partition Table)、幻数0x AA 55。一般在MBR中存放引导程序的一部分,由这部分指令读取引导程序剩余部分,加载整个引导程序到内存并继续运行引导程序。引导程序查询可引导的操作系统列表,提供给用户选择,或者在超过一个预设的时间值后,加载默认的操作系统项。操作系统加载完毕后,计算机执行权限交给操作系统,而引导程序则功成身退。操作系统从实模式开始,初始化各类资源与环境,最终向用户提供健壮、一致、高性能、功能完备的操作系统环境。

2 引导程序

2.1 功能

在BIOS完成硬件环境的初始化后,加载运行引导程序。引导程序的功能是从存储设备中加载操作系统,准备最小化的操作系统运行环境,并调用操作系统的启动过程。简单来讲,引导程序是计算机开机运行的第一个软件,它的使命是装载操作系统并运行。实际上,由于平台、存储介质、操作系统、文件系统等的多样性,引导程序都很复杂。此外,引导程序要求有更好的平台兼容性和健壮性。GRUBLILO是LINUX系统的两款典型引导程序。GRUB在功能、安全性、互操作性方面更具优势,基本上已全面取代LILO。

2.2 GRUB

Linux系统不支持直接引导自举,需要一个独立的引导程序加载。GNU GRUB是X86平台使用最为广泛的引导程序。GRUB支持多平台(例如X86、PowerPC等)、多存储介质(如硬盘、软盘、光盘、U盘)、多操作系统(如Linux、Gnu Hurd等)、多重引导(如Windows)、多文件系统(例如Ext2、Ext3、Ext4、FAT32、NTFS)。支持模块化扩展,可按照配置文件及命令行方式加载操作系统。

GRUB使用和分析参考博文GRUB

2.3 Multiboot Spec

为实现多操作系统共存,简化OS引导部分实现,GNU定义Multiboot Spec,包含如下三个方面的接口:

  • 引导程序看到的OS镜像格式;
  • 引导程序启动操作系统时的机器状态;
  • 引导程序传递给操作系统的信息格式。

请参考GNU Multiboot

3 操作系统

3.1 TMP

配置CPU运行环境,切换到虚地址模式(cr3寄存器),初始化内存管理子系统、调度子系统、中断子系统、进程派生环境、文件系统子系统,之后加载initrd,执行初始化进程init,内核接着引导程序把操作系统装载到内核中,并跳转到内核起始地址。

4 参考资料