from mosaic import *
OS2023(3)
3. 硬件视角的操作系统¶
Changelog & 反馈
- 降低了投影仪亮度 (更好的视频清晰度)
- 斥 ¥100 巨资翻倍了教室计算机的内存 (4GB → 8GB)
- 请大家检查 @smail.nju.edu.cn 的邮件 (重要通知均从邮件发送)
背景回顾:操作系统有三条主线:“软件 (应用)”、“硬件 (计算机)”、“操作系统 (软件直接访问硬件带来麻烦太多而引入的中间件)”。我们已经理解了操作系统上的应用程序的本质 (状态机)。而程序最终是运行在计算机硬件上的;因此有必要理解什么是计算机硬件,以及如何为计算机硬件编程。
本讲内容:计算机硬件的状态机模型;回答以下问题:
- 什么是计算机硬件?
- 计算机硬件和程序员之间是如何约定的?
- 听说操作系统也是程序。那到底是鸡生蛋还是蛋生鸡?
slideshow('3.1')
demo('logisim', 'i/logisim/')
为了让 “操作系统” 这个程序能够正确启动,计算机硬件系统必定和程序员之间存在约定——首先就是 Reset 的状态,然后是 Reset 以后执行的程序应该做什么。这么想,计算机硬件和操作系统就一点也不神秘了。
slideshow('3.2')
demo('firmware', 'i/firmware')
init.gdb 大幅简化了修改代码-执行调试-观测结果的流程。在这类基础设施上的投入是绝对值得的——让我们来假设一个 (固件工程师) 经常面临的场景:代码在模拟器中一切正常,但在真机 (或是无比简陋的开发板) 上却无法通过。此时,你的工作流程是:
- 修改你的代码,利用有限的机制向外输出信息
- 在模拟器中调试代码确认无误
- 部署到真实机器上运行,不断缩小问题的范围,直到定位到问题
如果没有基础设施的帮助,你的流程会被大幅拉长,直到折磨得你最终放弃。因此,《操作系统》课程中的另一个重要主题是不断提醒大家,我们应该思考做事的方式、大胆地问出好的问题,并且小心地去求证。
例如,在我们从 “概念上” 理解了计算机的启动过程后,就可以尝试 “代码级” 的深入理解了。通过检查 CPU Reset 时整个计算机系统的状态,我们就能发现 0x7c00 位置并没有出现 MBR 的内容——这确认了理论课部分的内容:MBR 是由 Firmware 加载的,而不是系统启动时就存在的。同时,我们也可以用 watchpoint 机制证明这一点,定位到加载 MBR 的精确汇编指令。计算机系统中没有魔法:其中绝大部分行为都是完全确定 (deterministic) 的,即便是不确定 (non-deterministic) 的部分,计算机系统依然是严格的数学对象,我们可以列举出不确定性的所有可能。
slideshow('3.3')
demo('hello-os', 'i/hello-os')
运行这段代码,我们需要设置 AM_HOME
环境变量为实验框架代码中的 AbstractMachine 所在目录 (绝对路径)。这句话中隐含了一些和操作系统相关的概念——例如什么是环境变量。自己动手解决这些 “小问题” 是必备的素质。同时也不用担心,我们会用一整个学期的时间带领大家熟悉这些代码。
Take-away Messages¶
计算机系统是严格的数学对象:没有魔法;计算机系统的一切行为都是可观测、可理解的。
- 处理器是无情的执行指令的机器
- 厂商配置好处理器 Reset 后的行为:先运行 Firmware,再加载操作系统
- 厂商逐渐形成了达成共识的 Firmware Specification (IBM PC “兼容机”、UEFI、……)
- 操作系统真的就是个 C 程序,只是能直接访问计算机硬件
课后习题/编程作业¶
1. 编程实践¶
在完成实验的过程中,如果不使用本次课展示的调试技巧 (而是用 “蛮力” printf 等),将会有更多的挫败感、付出多的多的时间。某种程度上说,课堂上的阅读代码和调试技术是大家对一定规模代码系统的入门必备习题。因此务必动手探索计算机系统的启动过程,和 Hello World 程序是如何在计算机硬件上运行的。