像 bash 或 command.com(Windows ME 之前)或 CMD.EXE(更高版本)这样的 shell 提供了一个接口,用于(除其他功能外)接受来自用户的命令。在运行 shell 之前,操作系统是什么样子的?在开发第一个 shell 之前,系统是如何使用的(例如 20 世纪 70 年代早期的 UNIX)?如果计算机甚至无法接受命令(没有命令行),用户如何与其交互?这个最基本的界面是什么?我可以在终端仿真器中运行这个界面吗?还是没有办法进入 shell?
答案1
在运行 shell 之前操作系统是什么样的?
取决于操作系统及其配置方式。Linux 可以配置为将启动文本写入控制台设备,无论是文本模式控制台、帧缓冲控制台还是串行端口。它也可以配置为完全静音。某些操作系统/系统可能会将诊断信息写入非易失性存储器,可以通过将系统置于开发人员、调试或诊断模式来访问该存储器。许多操作系统支持将启动和诊断信息输出到某种形式的 UART,即使对用户隐藏,这些信息也可能以某种方式在设备上可用(谷歌搜索“将串行端口添加到 DD-WRT”以了解制造商隐藏串行端口的位置以及如何访问它们的示例)。
操作系统根本就不需要外部显示器 - 它只是操作系统的另一个设备。
在开发第一个 shell 之前系统是如何使用的(例如 1970 年代早期的 UNIX)?
本质上(省略了很多,但应该能让你明白)——你可以通过拨动面板上的开关或使用纸带读取器(这些设备会直接写入内存,无需 CPU 干预)来加载程序,然后使用另一个开关启动 CPU。CPU 将运行此程序,生成其输出,然后停止。这是批处理,而不是交互式处理。如果你想运行不同的程序,你必须重新执行此操作。
如果计算机甚至不能接受命令(没有命令行),用户如何与其交互?
我不是这个领域的专家,但像 Altair、IMSAI 和 PDP-8 等老式计算机都有前面板开关,可以直接控制 CPU,并且可以在没有 CPU 干预的情况下直接读取和写入内存。
这个最基本的接口是什么?
我相信大多数(如果不是全部)现代 CPU 都有一个“JTAG 端口”,允许相同类型的直接操作。请记住,长期以来,大多数计算机都希望具有 ROM 或固件,当系统打开时,它会接管系统,然后再将其交给操作系统。在这里,可以存在预启动实用程序,或者存在用于加载此类实用程序的最小机制。一些引导加载程序(例如 U-Boot)可以通过串行端口访问。引导加载程序不会在操作系统“后面”运行,它们会加载操作系统,将控制权交给操作系统,然后它们不再运行。
我可以在终端仿真器中运行这个界面吗?或者没有办法通过 shell 来运行?
不,你需要一个 JTAG 接口。这涉及到电子领域,我承认我对此了解不多,除了我的大师插件附带一个,我可以直接用它对 GuruPlug 板上的闪存芯片进行编程 - 这意味着如果某些东西杀死了 GuruPlug 上的引导加载程序,我可以通过“独立于 CPU”的方式将其刷新回来。
答案2
操作系统不必提供当今常用的术语“shell”(即以交互方式接受用户命令的应用程序),但这样的操作系统对用户来说实际上“看起来”不像任何东西。正如 Oliver Salzburg 提到的,它可能只会显示一个空白屏幕(如果它有显示输出支持的话),尽管没有理由必须这样做。以引导和内核初始化过程中的 Linux 内核诊断输出为例。
Shell,无论是图形 Shell、命令行解释器还是其他什么,都使用操作系统提供的功能来执行诸如读取命令、启动进程、执行 I/O 重定向等操作。
然而,使用这些功能的应用程序没有理由有成为如地狱。
在过去,操作系统只是那些“有用例程”的集合,否则每个应用程序都必须从头开始重写,而计算机本质上是批处理设备。文件、磁盘和打印机 I/O 等内容可能是最先被收集到现在所谓的操作系统中的,其次是进程调度(值得注意的是,20 世纪 60 年代早期阿波罗制导计算机是一台多任务计算机)。这样,应用程序就可以调用操作系统,而不是使用自己的例程来执行此类操作,从而降低了编程复杂性,并可能有助于减少代码大小或执行时间(因为这些系统设施可以进行大量优化和调试,之后每个人都会受益)。随着计算机变得越来越普遍,操作系统增加了以用户为中心的功能,例如用户与计算机交互的方式,并以交互方式发出命令;图形外壳只是这种推理的延伸。
此外,不久前(想想 20 世纪 80 年代末),编写在个人电脑硬件上运行的应用程序仍然相当普遍,无需任何普通操作系统的帮助。这对于游戏来说尤其有用,因为它避免了操作系统本身的内存和处理开销,但我相信还有其他例子。在这些情况下,在某种程度上,该应用程序是其自己的操作系统因此,该应用程序提供的用户界面就是外壳。
答案3
早期的计算机并没有我们今天所理解的操作系统。它们将硬件中实现的功能直接暴露给在其上运行的任何程序。它们同时只能运行一个程序。程序本身必须控制所有任务,操作系统不会在“后台”执行任何操作。
但仍然有一个入口点供用户启动程序。如果延伸一下,你可以称之为“shell”。但基本上,它只是等待用户输入要运行的程序的第一位的硬件。无论是按下按钮、拨动开关、连接配电盘上的电线、穿孔卡、穿孔胶片还是磁带。也许他们甚至可以从先前加载的几个程序选项中进行选择。但即使通过按下旁边的按钮从以发光灯显示的列表中进行选择也已经可以被视为“shell”。
因此,如果您对“shell”的定义是“接受用户命令的界面”,那么在它之前就没有时间了,至少对于您甚至可以模糊地称之为计算机的设备来说是这样。
你可能想看看相当不错的维基百科关于计算历史的页面,尽管它并不太关注输入/输出视角。
答案4
从历史角度来看,我猜想当时有打孔卡(https://en.wikipedia.org/wiki/Punched_card)。与计算机系统交互。但我想这对于你的问题来说太久远了。