OS-计算机启动

OWPETER Lv3

Bootloader

即引导加载程序。

Booter要初始化系统硬件使之运行起来,Loader将操作系统加载到内存中,并跳转到操作系统的代码运行

Bootloader的实现严重依赖于硬件,不同板子的加载程序肯能不同

U-boot启动过程

stage1 和 stage2

  • 依赖于CPU体系结构的代码通常放在stage1且可以用汇编实现
  • stage2通过C语言实现

。。。

MIPS启动过程

MIPS基本地址空间

32位下,程序地址空间(4G)可以划分为4个大块

  • Mapped (kseg2) -> 1G
  • Unmapped uncached (kseg1) -> 512MB
  • Unmapped cached (kseg0) -> 512MB
  • User space -> 2G

从0xA000,0000 (kseg1)访问物理地址要抹掉高3位

从0x8000,0000 (kseg0)访问物理地址要去掉最高位

cached:需要cache使能

mapped:只有当页表(MMU)准备好了才能访问该区域

所以启动程序应该放在unmapped uncached (kseg1),这是唯一在系统启动时能够正常工作的地址空间

MIPS启动地址

启动入口地址是0xBFC00000,位于kseg1。这个向量对应的物理地址是0x1FC00000。上面留有4MB空间

stage1

设置堆栈:通过控制sp指针分配栈帧,主要目的是为了C语言传参(前提是RAM被激活了)

stage2

调用board.c中的函数进行初始化:时钟、环境变量、串口、内存、外设

最后进入命令行或直接启动Linux Kernal

LINUX启动过程

BIOS (Basic Input/Output System)

启动第一步:运行BIOS。

BIOS存储在ROM中,与硬件系统集成在一起,因此也被称为固件,保证掉电后内容不会丢失。CPU上电后将跳转到BIOS的固定存储地址,让初始化程序开始运行

功能

  • POST: Power-On Self-Test

    从CMOS中读取重要硬件组件列表,以及一些用户自定义数据

  • 读取启动顺序 (Boot Sequence)

    用户可以通过BIOS选择通过哪个设备引导电脑启动 (Boot Device)

UEFI (Unified Extensible Firmware Interface)

  • 另起炉灶

    上古时代的内存空间实在过于狭小,因此BIOS面临着向前兼容的巨大压力。在IT行业飞速发展的背景下,UEFI诞生了。

  • 特点

    具有C语言风格的参数堆栈传递方式,较BIOS而言更易于实现,容错和纠错特性更强,它运行于32位或64位模式,寻址能力更强

MBR (Master Boot Record)

启动第二步:读取MBR

MBR位于磁盘上第0磁头第0磁道,存放预启动信息、分区表信息

Boot Loader

启动第三步,运行操作系统内核加载器。在UEFI模式下会显示一个菜单,让用户选择要启动的操作系统。如果选择Linux,就会通过LILO或GRUB来识别文件系统,引导核心。

内核加载

一旦引导加载程序确定了要启动的操作系统,它就会将内核文件加载到内存中。内核文件位于/boot目录下,如果执行ls /boot命令,会看到该目录下有一个vmlinuz文件,这就是核心文件。

init进程

内核文件加载以后,就开始执行第一个进程/sbin/init。所有的进程都是该进程的衍生,都是其子进程。

init进程的作用有许多,其会读取/etc/inittab文件确定系统启动的运行级别(runlevel)。

linux有7种运行级别:(各个发型版本有所区别)

  • ‌0‌:系统停机(shutdown),用于关机。
  • 1‌:单用户模式(single user mode),通常用于系统维护,只有root用户能登录。
  • 2‌:多用户模式,没有网络文件系统(NFS)。
  • 3‌:完全多用户模式,提供完整的网络服务。
  • ‌4‌:保留未用,可以由系统管理员自定义。
  • ‌5‌:图形界面的多用户模式,启动X Window图形界面。
  • ‌6‌:重启(reboot),用于重启系统。

(这似乎解释了我一直以来的一个疑惑,即计算机关机后为什么知道自己真的要关机还是要重启)

如果你打开inittab文件,会看到其内容的第一行是:

1
id:2:initdefault:

这说明系统启动时的运行级别是2

再往下看:

1
2
3
4
5
6
7
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
13:3:wait:/etc/rc.d/rc 3
14:4:wait:/etc/rc.d/rc 4
15:5:wait:/etc/rc.d/rc 5
16:6:wait:/etc/rc.d/rc 6

这7个文件分别是7个不同运行等级需要启动的服务脚本。7个文件内列出的程序全部是链接文本,统一指向另外一个目录/etc/init.d/,真正的服务脚本都放在这一个目录下。这样做实现了启动脚本的统一管理。

用户登录

至此,开机启动程序加载完成了。我们终于迎来了熟悉的用户登录环节。

  • Title: OS-计算机启动
  • Author: OWPETER
  • Created at : 2025-03-04 15:47:52
  • Updated at : 2025-03-20 15:34:12
  • Link: https://owpeter.github.io/2025/03/04/OS-计算机启动/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments