计算机启动的基本过程

文章目录

  • 1. 上电
  • 2. BIOS自检
  • 2.1 硬件自检
  • 2.2 查找引导设备
  • 3. 系统引导
  • 4. 操作系统初始化
  • 参考

当用户按下开机按钮后, 再到操作系统初始化完毕大概可以分为4个步骤

1. 上电

比如按下电脑上的电源按钮, 这个过程就是’上电’.

上电后, CPU的RESET引脚会产生一个逻辑值来复位CPU, CPU唤醒后, CPU将在0xfffffff0处执行一条长跳转指令, 直接跳到固化在ROM中的启动代码处(即BIOS), 然后执行BIOS的代码

2. BIOS自检

2.1 硬件自检

顾名思义, BIOS程序负责检测系统外围关键设备比如CPU, 内存, 显卡, I/O, 键盘鼠标等是否正常, 如果自检无法通过则系统无法启动. 检测通过后会显示出这些设备的信息.

2.2 查找引导设备

此时, BIOS需要知道"下一阶段的启动程序"是谁, 所以需要从Boot的启动序列中顺序检查该设备是否可以启动, 可以启动的标志就是该设备第一个分区最前面的512字节(即主引导记录MBR)的最后两个字节是不是0x55和0xaa. 为什么是0x55和0xaa? 因为AA展开为10101010, 55展开为01010101,变成串行电平的话就是一个占空比为50%的方波, 这种方波在电路中最容易被分辨是否受干扰或者畸变.

3. 系统引导

BIOS把MBR这第一部分引导代码复制到0x7c00地址所在的物理内存中, 就退出了. 被复制的这部分代码就是BootLoader, 比如grub就是一种常见的BootLoader. 系统读取内存中的grub配置信息(定义在/etc/grub.con,以及/etc/grub/menu.lst和/etc/grub.conf的软连接),并依照此配置信息生成的内核列表来启动不同的操作系统。

MBR共512字节, 其中前446字节为引导程序及参数, 然后是4个16字节的“硬盘分区表”, 及2字节的结束标志.

硬盘分区表可以将一个硬盘最多分为4个一级分区, 一级分区又叫做主分区. 每个主分区占据16个字节, 这16个字节分为6个部分, 这6个部分主要描述了该分区的结构信息. 这里重点关注第一个字节, 如果该字节为0x80, 则该分区是激活分区, 激活分区中存储了加载器. MBR找到加载器后就会把CPU的控制权交给加载器然后退出.

另外扩展一点, 分区结构信息中的最后四个字节描述了该主分区的扇区总数, 所以该分区的扇区总数最多不会超过2的32次方, 如果每个扇区为512字节, 那么意味着该分区最大不超过2TB. 所以如果想使用更大的硬盘, 可以提高每个扇区的字节数或者增加扇区总数.

CPU的控制权交给硬盘的激活分区分为2种情况:

  1. 要引导的操作系统位于主分区内. 此时CPU会读取激活分区的第一个扇区(即卷引导记录VBR). VBR主要作用是告诉CPU操作系统在这个分区的位置, 随后CPU便会加载操作系统了. 注意4个主分区里面只有一个是激活的.
  2. 要引导的操作系统位于逻辑分区内. 如果4个主分区不够时, 但是分区表最多又只有4个, 因此规定有且只有一个区可以被定义为扩展分区. 扩展分区理论上可以有无数个逻辑分区. 此时CPU读取扩展分区的第一个扇区(即扩展引导记录EBR). EBR中有一张64字节的分区表, 但是最多只有2个分区, 第一个分区指向该逻辑分区的本身的引导扇区, 第二个分区指向下一个逻辑分区的EBR(如果存在第二个分区的话), 该EBR仍可以被分成类似这样的两个分区, 即扩展分区中逻辑驱动器的引导记录是链式的. 在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等).

4. 操作系统初始化

控制权转交给操作系统后, 操作系统的内核首先被载入内存.

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

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

至此, 全部启动过程完成.

详细可以查看参考这篇博文史上最详细linux启动过程讲解—没有之一.

参考

主引导记录
linux启动过程
关于0xAA和0x55
Linux启动过程详解
计算机的启动过程(详细)
史上最详细linux启动过程讲解—没有之一

你可能感兴趣的:(Operation,计算机,启动,开机)