Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

操作系统总装

复习

  • 日志文件系统:先记下修改意图,再安全地更新真实结构
  • 用户、权限与访问控制:操作系统怎样判断谁能读文件、操作进程和使用设备
  • 隔离的边界:虚拟机与容器:虚拟机隔离机器,容器隔离进程

TL;DR

  • 这一章不引入新概念,只让一个程序从磁盘完整跑起来
  • 把启动、进程、内存、文件、设备、权限、隔离串成一条线
  • 你会看到,前面每一章造出的部件,在这里各就各位
  • 操作系统这条主线,就此闭合

正文

  零件都齐了。现在,我们让一个程序从磁盘上的一个文件,真正变成屏幕上能跑的东西。本章不教新东西,只把这一路串起来。

从按下电源开始

  1. 上电复位:CPU 从固定地址开始执行,固件醒来,自检、找到启动设备
  2. 引导:引导程序把内核装进内存,跳过去
  3. 内核初始化:建立内存管理、中断、设备与调度结构

  到这一步,管理者已经就位,但还没有任何用户程序。

一个程序被“请”进来

  1. 创建进程:内核把可执行文件装入内存,建立它的地址空间
  2. 建立页表:为这个进程准备页表,把虚拟地址映射到物理页;TLB 之后会逐渐装满
  3. 装载:按需把代码页读进内存,其余暂留磁盘

  程序此时有了“生命”,但还在等待 CPU。

它开始跑

  1. 被调度:调度器从就绪队列里选中它,上下文切换,CPU 交给它
  2. 取指执行:CPU 一遍遍取指、译码、执行;访存时经 TLB 与页表完成地址转换
  3. 用文件:它调用系统调用打开文件,拿到文件描述符;读写经由页面缓存落到磁盘
  4. 用设备:它输出内容到屏幕,设备驱动把请求翻译给控制器,必要时用中断或 DMA
  5. 遇到缺页:若访问的页不在内存,触发缺页异常,内核调页后重试

系统在背后维持秩序

  整个过程中,操作系统一直在一旁工作:

  • 进程管理:随时切换、调度、回收
  • 内存管理:分页、置换、按需加载
  • 文件与设备:缓存、日志、驱动
  • 保护:权限检查、用户态与内核态的边界
  • 隔离:进程之间互不干扰,必要时还能用虚拟机或容器再隔一层

一次完整的旅程

按下电源 → 固件 → 引导程序 → 内核初始化
   → 创建进程 → 建立地址空间 → 调度上 CPU
   → 取指/译码/执行 → 地址转换 → 读写文件与设备
   → 缺页/中断随时插入 → 运行结束 → 回收资源

  回头看,从第 48 章“按下电源”,到此刻一个程序真正跑完,操作系统做的事无非一句话:在有限的硬件上,让许多程序安全、公平、高效地共存。 它把这个又乱又难用的硬件世界,收拾成了程序敢用、能用的样子。

  操作系统这条线到此闭合。接下来,把一台机器连成一张网,是另一段故事了。

思考题

  回看整条旅程,如果让你挑一个“最关键的设计”,你会选哪一个(比如进程抽象、虚拟内存、文件、还是内核态/用户态)?它到底解决了什么问题,又带来了什么代价?

小结

知识点

  • 一个程序从磁盘到运行的完整旅程
  • 启动、进程、内存、文件、设备、保护的协作
  • 操作系统以“安全、公平、高效地共享硬件”为目标
  • 组成原理与程序基础的知识在操作系统里交汇

参考资料

  1. Wikipedia(zh):操作系统:操作系统的整体职责
  2. Wikipedia(zh):程序生命周期:从程序到进程

思考题答案(仅供参考)

  开放性问题,没有标准答案。若选进程抽象,它解决了“如何让多个程序共享一台机器”的核心难题,代价是要处理并发与调度。若选虚拟内存,它解决了“程序互不干扰、又能用超过物理内存的空间”,代价是复杂的地址转换与缺页处理。若选内核态/用户态,它是所有保护的基石,代价是系统调用的切换开销。你可以挑一个最触动自己的,说清它“解决了什么、付出了什么”——这本身就是理解操作系统的最好方式。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪