操作系统总装
复习
- 日志文件系统:先记下修改意图,再安全地更新真实结构
- 用户、权限与访问控制:操作系统怎样判断谁能读文件、操作进程和使用设备
- 隔离的边界:虚拟机与容器:虚拟机隔离机器,容器隔离进程
TL;DR
- 这一章不引入新概念,只让一个程序从磁盘完整跑起来
- 把启动、进程、内存、文件、设备、权限、隔离串成一条线
- 你会看到,前面每一章造出的部件,在这里各就各位
- 操作系统这条主线,就此闭合
正文
零件都齐了。现在,我们让一个程序从磁盘上的一个文件,真正变成屏幕上能跑的东西。本章不教新东西,只把这一路串起来。
从按下电源开始
- 上电复位:CPU 从固定地址开始执行,固件醒来,自检、找到启动设备
- 引导:引导程序把内核装进内存,跳过去
- 内核初始化:建立内存管理、中断、设备与调度结构
到这一步,管理者已经就位,但还没有任何用户程序。
一个程序被“请”进来
- 创建进程:内核把可执行文件装入内存,建立它的地址空间
- 建立页表:为这个进程准备页表,把虚拟地址映射到物理页;TLB 之后会逐渐装满
- 装载:按需把代码页读进内存,其余暂留磁盘
程序此时有了“生命”,但还在等待 CPU。
它开始跑
- 被调度:调度器从就绪队列里选中它,上下文切换,CPU 交给它
- 取指执行:CPU 一遍遍取指、译码、执行;访存时经 TLB 与页表完成地址转换
- 用文件:它调用系统调用打开文件,拿到文件描述符;读写经由页面缓存落到磁盘
- 用设备:它输出内容到屏幕,设备驱动把请求翻译给控制器,必要时用中断或 DMA
- 遇到缺页:若访问的页不在内存,触发缺页异常,内核调页后重试
系统在背后维持秩序
整个过程中,操作系统一直在一旁工作:
- 进程管理:随时切换、调度、回收
- 内存管理:分页、置换、按需加载
- 文件与设备:缓存、日志、驱动
- 保护:权限检查、用户态与内核态的边界
- 隔离:进程之间互不干扰,必要时还能用虚拟机或容器再隔一层
一次完整的旅程
按下电源 → 固件 → 引导程序 → 内核初始化
→ 创建进程 → 建立地址空间 → 调度上 CPU
→ 取指/译码/执行 → 地址转换 → 读写文件与设备
→ 缺页/中断随时插入 → 运行结束 → 回收资源
回头看,从第 48 章“按下电源”,到此刻一个程序真正跑完,操作系统做的事无非一句话:在有限的硬件上,让许多程序安全、公平、高效地共存。 它把这个又乱又难用的硬件世界,收拾成了程序敢用、能用的样子。
操作系统这条线到此闭合。接下来,把一台机器连成一张网,是另一段故事了。
思考题
回看整条旅程,如果让你挑一个“最关键的设计”,你会选哪一个(比如进程抽象、虚拟内存、文件、还是内核态/用户态)?它到底解决了什么问题,又带来了什么代价?
小结
知识点
- 一个程序从磁盘到运行的完整旅程
- 启动、进程、内存、文件、设备、保护的协作
- 操作系统以“安全、公平、高效地共享硬件”为目标
- 组成原理与程序基础的知识在操作系统里交汇
参考资料
- Wikipedia(zh):操作系统:操作系统的整体职责
- Wikipedia(zh):程序生命周期:从程序到进程
思考题答案(仅供参考)
开放性问题,没有标准答案。若选进程抽象,它解决了“如何让多个程序共享一台机器”的核心难题,代价是要处理并发与调度。若选虚拟内存,它解决了“程序互不干扰、又能用超过物理内存的空间”,代价是复杂的地址转换与缺页处理。若选内核态/用户态,它是所有保护的基石,代价是系统调用的切换开销。你可以挑一个最触动自己的,说清它“解决了什么、付出了什么”——这本身就是理解操作系统的最好方式。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪