文章

操作系统学习笔记 | 2. 操作系统的启动与核心机制

启动

从计算机系统的角度来说,计算机启动时主要涉及三个部分:CPU、内存和 I/O

操作系统最初存储在硬盘(DISK)上,由 BIOS(基本 I/O 系统)提供支持。BIOS 的基本功能是在电源启动后检测外设并加载相应的软件。硬盘上还存储了 BootLoader 软件,用于加载操作系统。

启动流程如下:

  1. 加电 -> BIOS 加电自检(POST) -> 检查显卡和执行 BIOS

  2. BIOS 加载 BootLoader(通常位于硬盘第一个扇区,大小为 512 字节)

  3. BootLoader 加载操作系统到内存

  4. BootLoader 将 CPU 控制权交给操作系统


核心机制

操作系统通过三个基本机制与设备和应用程序交互:

  1. 系统调用:应用程序向操作系统发出服务请求。

  2. 异常:因非法指令或内存出错等问题,由不良的应用程序触发。

  3. 中断:硬件设备(如计时器、网络)主动发送的信号。

为什么应用程序不能直接操作外设?

  • 操作系统是被信任的第三方,确保系统的安全性和可靠性。

  • 只有内核能够执行特权指令。

  • 为简化应用程序开发,操作系统提供一致、简单的接口。

三大机制的特点

来源

处理时间

响应

系统调用

异步或同步

等待并持续执行

异常

同步

杀死或重新执行意外指令

中断

异步

持续,对用户应用程序透明


中断处理流程

硬件部分:

  1. 设置中断标记。

  2. 设置中断事件的 ID。

软件部分:

  1. 保存当前处理状态(便于后续恢复)。

  2. 执行中断服务程序。

  3. 清除中断标记。

  4. 恢复之前保存的处理状态。


异常处理流程

  1. 设置异常编号。

  2. 保存现场。

  3. 异常处理(杀死产生异常的程序或重新执行异常指令)。

  4. 恢复现场。


系统调用

操作系统通过 系统调用接口(System Call Interface) 向应用程序提供服务。例如,C 语言的 printf() 调用底层的系统调用 write()

应用程序通过 高层次 API(如 Windows 的 Win32 API 或 JVM 的 Java API)间接发起系统调用,触发从 用户态内核态 的转换:

  • 用户态:特权级较低,无法访问特权指令和 I/O。

  • 内核态:可以执行特权指令和访问 I/O。

这种状态划分确保了系统的安全性与可靠性。


三大机制跨域系统边界

三大核心机制均涉及应用程序和操作系统的边界切换,这会带来额外开销:

  • 建立中断、异常、系统调用号与服务例程映射关系的初始化开销。

  • 内核堆栈的创建与切换开销。

  • 参数安全性验证的时间开销。

  • 地址空间的映射与权限更新开销。

尽管存在这些开销,它们是保障操作系统安全性和可靠性的必要代价。


总结

操作系统的启动从硬件初始化到加载内核,再到运行应用程序,体现了硬件和软件的紧密协作。通过系统调用、异常和中断三大核心机制,操作系统与应用程序及硬件设备高效交互,确保系统的安全性、稳定性和易用性。同时,这些机制虽然增加了边界切换的开销,但其设计原则和实现方法在计算机系统中具有不可替代的价值。

License:  CC BY 4.0