OS-计算机启动

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 | 10:0:wait:/etc/rc.d/rc 0 |
这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.