0%

操作系统初始化

参考: 中国科学院大学 2025年秋《高级操作系统教程》课件

计算机启动

启动流程:

start

从上电到内核的第一行代码:BIOS -> bootload

任务:

  1. 硬件初始化 (BIOS)
    • 初始化 BIOS
    • 检查 CPU 寄存器
    • 检查 BIOS 代码的完整性
    • 检查 DMA, timer, interrupt controller
    • 检查系统内存
    • 检查系统总线和外部设备
    • 跳转到下一级 BIOS (如 VGA-BIOS ) 执行并返回
    • 识别可以启动的设备(CD-ROM? USB? HDD?)
  2. 加载内核代码到内存 (bootloader)

BIOS (Basic Input/Output System,基本输入输出系统)

存放于 BIOS 芯片(ROM)中

三大任务:

  1. 初始化硬件
    • 在计算机开机时对系统各组件进行检查
  2. 启动操作系统
    • 加载引导程序(bootloader)或操作系统
  3. 提供硬件的软件抽象
    • 向操作系统提供系统配置信息
    • 向操作系统提供硬件访问接口,向操作系统隐藏硬件的变化
      • 现代操作系统会忽略 BIOS 提供的抽象层并直接访问硬件

BIOS 中的主要内容:

  1. 程序段:
    1. 自诊断程序
      通过读取 CMOS RAM 中的内容,识别硬件配置,并对其进行自检和初始化
    2. CMOS设置程序
      引导过程中,用特殊热键启动,进行设置后,存入 CMOS RAM 中
    3. 系统自检装载程序
      在自检成功后,将磁盘 0 磁道 0 扇区上的引导程序装入内存,让其运行以装入系统
    4. 主要 I/O 设备的驱动程序和中断服务
  2. 数据段: 系统基本配置

缺点:

  • 采用汇编语言编写,维护困难
  • 以 16 位模式的代码的形式存在,这就给运行于增强模式的操作系统访问其服务造成了困难

EFI / UEFI (Extensible Firmware Interface / Unified Extensible Firmware Interface)

EFI/UEFI 的优点:更易于实现,容错和纠错特性更强,缩短了研发时间

  • 模块化
  • C语言
  • 动态链接较
  • 标准接口
  • 开放统一
  • 开源
  • 运行于32位或64位模式
  • 充分的向下兼容性
    • EFI 系统下的驱动用 EFI Byte Code 编写而成,不是直接可运行的二进制代码
    • EFI Byte Code: 专用于 EFI 驱动的虚拟机器语言,必须在 EFI 驱动运行环境下被解释运行
    • 利用加载 EFI 驱动的形式,识别及操作硬件
UEFI

bootloader 引导程序

存放于磁盘的 MBR 扇区

  • 开机时,引导操作系统启动的程序
  • BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 bootloader 读到系统的 RAM 中,然后将控制权交给 bootloader

bootloader 的主要任务:

  1. 将操作系统内核从硬盘加载到 RAM 中
    • 需要为操作系统提供启动参数,以实现定制化启动
  2. 跳转到内核的入口点去执行,即启动操作系统

常见的bootloader:
Grub, isolinux, uboot, openSBI,ntldr(用于启动Windows系统) ,Linuxboot

两种磁盘分区表:

  1. MBR
1
2
3
4
5
+-------------+----------------------+--------------+
| boot loader | Disk Partition Table | Magic Number |
+-------------+---+---+---+---+------+--------------+
| code | 1 | 2 | 3 | 4 | ... | 0x55AA |
+-------------+---+---+---+---+------+--------------+
  1. GPT
1
2
3
4
5
6
7
8
9
10
11
+------+---------------------------+---------------------+-----------+--------+
| PMBR | Partition Table | Partition | Table | GPT |
| | | | Backup | Backup |
+------+-----+---+---+---+---+-----+---+---+---+---+-----+-----------+--------+
| | GPT | | | | | | | | | | | Partition | GPT |
| MBR | HDR | 1 | 2 | 3 | 4 | ... | 1 | 2 | 3 | 4 | ... | Table | HDR |
| | | | | | | | | | | | | Backup | Backup |
+------+-----+---+---+---+---+-----+---+---+---+---+-----+-----------+--------+
| LBA0 | LBA1| LBA2 |LBA3~| LBA35 ~ LBA-35 | LBA-34~ | LBA-1 |
| | | |LBA34| | LBA-2 | |
+------+-----+---------------+-----+---------------------+-----------+--------+

当前在 Linux 上希望统一 bootloader 的进展: LinuxBoot
LinuxBoot

从内核的第一行代码到第一个用户态程序的第一行代码:kernel boot

任务:

  1. 配置页表并开启虚拟内存机制,允许使用虚拟地址
  2. 配置异常向量表并打开中断,允许”双循环”