没有操作系统的程序
复习
- 程序在内存里的样子:代码区、数据区、栈和堆的初步全景
- 从源代码到可执行文件:编译、汇编和链接的完整流水线
- 编译与解释:程序变成机器指令的两条基本道路
TL;DR
- 早期计算机没有操作系统,程序直接跑在裸机上
- 裸机程序得自己解决:从哪里开始执行、怎样使用设备、多个程序怎样共存
- 设备五花八门,每个程序都要自己写控制硬件的代码,换设备就得重写
- 正是这些麻烦,一点点催生了操作系统
正文
一路写到这里,程序已经能从文字变成可执行文件了。可我们一直享受着一样东西,却从没提过它的名字—— 操作系统 。
这一章,我们故意把它拿掉,看看“裸机”上的日子有多难过。看清了这些麻烦,也就看清了操作系统是来干什么的。
麻烦一:谁来装载
一个可执行文件静静躺在硬盘上。先问几个最基本的问题:
- CPU 通电后,第一件事从哪个地址开始执行?
- 谁把程序从硬盘搬进内存?
- 程序里写着“跳到某个地址”,可它被放到内存的哪个位置,是谁定的?
现实中的 CPU 有一个约定:上电后从某个固定地址取第一条指令。至于之后怎么一步步找到操作系统、找到你的程序,需要一整套安排。在“第一次呼吸”里,我们是手动把程序摆进地址 0 的——现实不可能每次都靠人手动摆。
麻烦二:怎么用设备
程序想从键盘读一个键,或者往屏幕打个字,怎么办?
它还是一条条指令,可键盘、屏幕、硬盘这些设备,各有各的控制方式:往哪个端口写什么、等哪个状态位、怎么判断按键有没有按下…… 每一个设备的细节,都得写进程序里。
于是就有了这样的噩梦:
- 换了块新键盘,程序得改
- 想同时支持两种显示器,程序里得写两套代码
- 硬盘型号一变,读写的代码全要重来
程序的大部分篇幅,不是在解决用户的问题,而是在伺候硬件。
麻烦三:多个程序怎么共存
更难的是:一台计算机上不止一个程序。
- 两个程序都想运行,谁先上?
- 一个程序正跑着,要不要让另一个也跑一会儿?怎么切过去、又怎么切回来?
- 两个程序都想用同一块内存怎么办?怎么保证它们互不干扰?
- 一个程序算错了、乱改内存,会不会把另一个程序也拖垮?
这些事,单靠一个个程序自己是解决不了的。它们彼此不知道对方的存在,却又共用着同一台机器。
麻烦四:资源谁来分配
再往深想一层:内存、CPU 时间、磁盘、设备,都是有限的资源。
- 谁来记录哪些资源已经被占用、哪些还空着?
- 程序用完了,谁来回收?
- 谁有资格用、谁没资格用?怎么防止某个程序独占一切?
这一桩桩,都不是某个具体程序的私事,而是 所有程序共同面对 的问题。
于是,需要一位管理者
把上面的麻烦列一列:装载、启动、设备、多程序、资源分配、保护……它们有一个共同点—— 都在替大家协调和兜底 。
与其让每个程序各自为政、重复造轮子,不如让一个专门的软件站出来,统一管理这些资源,给程序提供方便又安全的服务。这个软件,就是 操作系统 (operating system)。
它不是凭空冒出来的,而是被上面这些真实困难一步步逼出来的——就像当初计算机是被“繁琐计算”逼出来的一样。
下一部分,我们从“按下电源”那一刻开始,亲眼看着这位管理者登场:看看它怎样被加载起来、怎样划分边界、又怎样让许多程序在同一台机器上安然共处。
思考题
如果一台计算机永远只运行一个程序,而且这个程序也不在乎安全和方便,上面哪些麻烦可以不管?哪些麻烦无论如何都躲不掉?
小结
知识点
- 裸机程序要自己解决装载与启动
- 没有操作系统时,每个程序都要自己驱动设备
- 多个程序共存会带来切换、隔离和保护问题
- 资源分配与回收需要统一管理者
- 操作系统正是为解决这些问题而生
参考资料
- Wikipedia(zh):操作系统:操作系统的职责
- Wikipedia(zh):裸机:没有操作系统的程序
- Wikipedia(zh):引导程序:计算机如何启动
思考题答案(仅供参考)
如果只运行一个程序,而且不在乎安全与方便,那么“多程序切换与隔离”“资源公平分配”这些可以暂时不管;但“从哪开始执行、怎样装载、怎样使用设备”这几样,无论如何都躲不掉——因为只要程序要在真实硬件上跑起来,就必须解决这些问题。换句话说,操作系统的“管理”功能可以被简化,但它“让程序跑起来”的基础功能是省不掉的。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪