Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

第四十七章:没有操作系统的程序

复习

  • 程序经由编译或解释,最终落实为机器能执行的动作。
  • 可执行文件需要被放入内存,并从正确的位置开始运行。

TL;DR

  • 没有操作系统时,程序必须自己面对启动、内存和设备。
  • 这种直接运行在硬件上的程序称为裸机程序。
  • 操作系统会把这些反复出现的工作收集起来,为多个程序提供共同环境。

正文

  把操作系统暂时想象成不存在。电源接通后,CPU 只会从规定的位置取第一条指令。它不知道你的程序在哪个文件夹,也不知道显示器如何显示文字,更不会自动为两个程序划分内存。

  在这种环境中,开发者必须把机器码放到约定地址,设置好栈,直接读写设备寄存器。例如,要点亮一个 LED,程序可能把一个位写到某个输入输出地址;要接收键盘输入,就要理解键盘控制器给出的信号。这样的程序称为裸机程序(bare-metal program)。固件、微控制器中的小程序,以及开机早期的一部分代码,都常处在这种世界里。

  裸机并不神秘。第 35 章那台刚刚“呼吸”的小计算机就是如此:它从内存开始执行,按指令读写数据和接口。它的优点是路径短、控制直接;困难是每个程序都得重新处理硬件细节,而且一个程序写错地址,可能损坏任何数据。

  当机器要运行更多程序、连接更多设备时,重复劳动很快显现出来:谁负责装入程序?谁让它暂时停下,换另一个程序运行?谁隔开不同程序的内存?谁提供读取文件、显示文字、收发数据的共同办法?

  这些问题不是在硬件之外凭空出现的,而正是“已有一台能执行程序的计算机”自然长出的下一层。接下来,我们让一段特殊的程序率先启动,它就是操作系统。

思考题

裸机程序把一个值写入错误的输入输出地址,为什么比普通变量写错位置更危险?

小结

知识点

  • 裸机程序直接在硬件上运行,不依赖操作系统提供服务。
  • 它必须自行安排启动、内存和设备访问。
  • 操作系统把许多程序共用的底层事务组织成统一环境。

参考资料

  • Jonathan Corbet 等,《Linux 设备驱动程序》
  • Andrew Tanenbaum、Herbert Bos,《现代操作系统》

思考题答案(仅供参考)

  输入输出地址可能连接着真实设备控制器。写入错误值不只是改坏内存中的数据,还可能触发或扰乱硬件动作;具体后果取决于设备设计。

协议

本文采用 CC BY-NC-SA 4.0 协议发布。