诸如bash或command.com(在Windows ME或更高版本)或CMD.EXE(在更高版本中)之类的外壳提供了一个界面(除其他外)接受来自用户的命令。运行Shell之前,操作系统是什么样的?在开发第一个外壳程序之前(例如1970年代初期的UNIX)如何使用系统?如果计算机甚至不能接受命令(没有命令行),那么用户如何与之交互?这个最基本的界面是什么?我可以在终端仿真器中运行此接口,还是在外壳后面没有办法?
诸如bash或command.com(在Windows ME或更高版本)或CMD.EXE(在更高版本中)之类的外壳提供了一个界面(除其他外)接受来自用户的命令。运行Shell之前,操作系统是什么样的?在开发第一个外壳程序之前(例如1970年代初期的UNIX)如何使用系统?如果计算机甚至不能接受命令(没有命令行),那么用户如何与之交互?这个最基本的界面是什么?我可以在终端仿真器中运行此接口,还是在外壳后面没有办法?
Answers:
运行Shell之前,操作系统是什么样的?
取决于操作系统及其配置方式。可以将Linux配置为将启动文本写入控制台设备,无论是文本模式控制台,帧缓冲控制台还是串行端口。也可以将其配置为完全静音。某些OS /系统可能会将诊断信息写入非易失性内存,可以通过将系统置于开发人员,调试或诊断模式下进行访问。许多操作系统支持将启动和诊断信息输出到某种形式的UART,即使对用户隐藏了,也可能以某种方式在设备上可用(例如,“制造商将串行端口添加到DD-WRT”,例如制造商隐藏串行端口的方式以及如何您可以找到他们)。
操作系统根本不需要外接显示器-只是操作系统的另一台设备。
在开发第一个外壳程序之前(例如1970年代初期的UNIX)如何使用系统?
本质上(并花了很多钱,但这应该会让你明白)-通过翻转面板上的开关或使用纸带阅读器(这些设备无需CPU干预即可直接写入内存)来加载程序。用另一个开关切换到CPU。CPU将运行该程序,生成其输出,然后停止。与交互式处理相反,这是批处理。如果要运行其他程序,则必须重新执行。
如果计算机甚至不能接受命令(没有命令行),那么用户如何与之交互?
我不是这个领域的专家,但是像Altair,IMSAI和PDP-8这样的旧计算机都具有前面板开关,这些开关可以直接控制CPU,并且可以在无需CPU干预的情况下直接读取和写入内存。
这个最基本的界面是什么?
我相信,即使不是全部,大多数现代CPU都有一个“ JTAG端口”,该端口允许相同类型的直接操作。请记住,很长一段时间以来,大多数计算机都希望拥有ROM或固件,这些固件会在打开系统之前将其控制权交给操作系统。在这里,可以存在预引导实用程序,或者存在用于加载此类实用程序的最小机制。可以通过串行端口访问某些引导加载程序,例如U-Boot。引导加载程序不会在操作系统“后面”运行,而是会加载操作系统并对其进行手动控制,然后它们将不再运行。
我可以在终端仿真器中运行此接口,还是在外壳后面没有办法?
不,您需要一个JTAG接口。那已经进入了电子领域,我承认我对此不太了解,除了我的GuruPlug附带了一个,而且我可以用它直接在GuruPlug的板上编程闪存芯片-这意味着如果某些东西杀死了主板上的引导程序, GuruPlug,我有一种“独立于CPU”的方式将其闪回。
操作系统不必提供外壳程序,因为该术语在今天很常用(意味着应用程序将以交互方式接受用户的命令),但是这样的操作系统对于用户而言根本不会真正“看起来”任何东西。用户。正如奥利弗·萨尔茨堡(Oliver Salzburg)所说,它可能只会显示一个空白屏幕(如果它完全支持显示输出),尽管没有理由。以启动和内核初始化过程中Linux内核的诊断输出为例。
无论是图形外壳,命令行解释器还是其他外壳,外壳都使用操作系统提供的功能来执行诸如读取命令,启动进程,进行I / O重定向等操作。
然而,没有理由使用这些设施的应用程序有是一个外壳。
在过去,操作系统只是这些“有用例程”的集合,否则每个应用程序都必须从头开始重写这些“有用例程”,而计算机本质上是批处理设备。文件,磁盘和打印机I / O之类的东西可能是最早被收集到现在称为操作系统的东西中,其次是进程调度(值得注意的是,1960年代初期的Apollo Guidance Computer是多任务计算机。)。然后,应用程序可以调用OS,而不必使用自己的例程来执行此操作,这降低了编程复杂性,并可能有助于减少了代码大小或执行时间(因为可以对这些系统设施进行大量优化和调试,然后每个人都会受益) 。随着计算机变得越来越普遍,操作系统增加了很多以用户为中心的功能,例如用户与计算机交互并以交互方式发出命令的方式。图形化外壳只是该推理方法的扩展。
另外,不久前(直到1980年代后期),编写应用程序以在裸机个人计算机硬件上运行而无需任何普通操作系统的帮助仍然相当普遍。这对于游戏特别有用,因为它避免了适当的操作系统的内存和处理开销,但是我敢肯定还有其他示例。在某些情况下,在某些情况下,该应用程序是其自己的操作系统,因此,该应用程序提供的用户界面就是外壳。
早期的计算机没有今天我们所使用的操作系统。他们将硬件中实现的功能直接暴露给其上运行的任何程序。一次只能在它们上运行一个程序。该程序本身必须控制所有任务,而OS并未在“后台”执行任何操作。
但是,仍然有一个供用户启动程序的入口点。如果您扩展单词,则可以将其称为“外壳”。但基本上,只是硬件在等待用户输入要运行的程序的第一位。它可以是按下按钮,轻弹开关,配电盘上的已连接电线,打孔卡,打孔薄膜或磁带的形式。也许他们甚至可以从先前加载的几个程序选项中进行选择。但是,即使通过按旁边的按钮从显示为发光灯的列表中进行选择,也已经被认为是“外壳”。
因此,如果您对“外壳”的定义是“一个接受用户命令的接口”,那么就没有时间了,至少对于您甚至模糊地称为计算机的设备而言。
您可能想查看有关计算历史的非常不错的Wikipedia页面,尽管它并不十分关注输入/输出角度。
从历史的角度来看,我猜想有打孔卡(https://en.wikipedia.org/wiki/Punched_card)。与计算机系统进行交互。但是,我想这已经很远了。
大学毕业后我使用的第一个操作系统(1981)是Prime微型计算机上的PRIMOS。这是一个分时操作系统,它支持许多用户,每个用户都使用通过RS232电缆连接到计算机的终端。您必须登录到提供用户名和密码的终端。您的终端会话是各种各样的shell。您可以编辑文件,编译,运行我们如今要做的所有事情。所有终端都可以访问同一归档系统。这些终端在很大程度上只不过是打字机-没有WYSISWYG编辑器,甚至emacs都是梦。
该操作系统的结构与现在非常相似,可以想象成一层洋葱皮。最内层具有非常低级的功能-例如硬件控制,内存访问。向外,将添加文件系统,然后添加用户层。在您的程序中,您将能够与某些层进行交互,但不能与最内层进行交互(因此,您将无法与分时或实际硬件(灯光等)混淆)。没有外壳的计算机就像是这些内部层之一,它可能能够访问硬盘和磁带读取器(真的!),但它不知道文件或用户。
要引导早期的计算机,您需要加载一组基本的指令(这可能涉及在计算机上按设置的顺序切换物理交换机)。此序列将启动第二个小程序,该程序可以使磁带读取器正常工作。然后,您将通过磁带读取器加载更复杂的系统,这可能会使磁盘驱动器联机。您可以想象无壳操作系统就像这些初始加载器之一。
如今,计算机具有类似的顺序,因此,在启动计算机时,它将加载其BIOS,该BIOS将启动磁盘,网卡,视频卡等,然后BIOS在硬盘上查找特定程序并在Windows上运行该程序。至少)。Unix做了类似的事情,它从非常基本的模块开始逐步建立内核,并在它们之上构建,直到到达登录提示。
操作系统的定义相当模糊。它本身就是内核吗?是内核以及附带的工具吗?Linux是内核,但GNU / Linux是基于Linux内核和GNU项目工具的操作系统。Shell是此类操作系统的组成部分。
但是,一旦Linux启动并完成“引导”,则需要告诉它要运行什么程序。从那时起,一切都掌握在该特定程序中。默认情况下,init
它知道下一步该怎么做,并最终使您进入漂亮的GUI登录屏幕。但这不是必须的。您可以这样启动
kernel /boot/vmlinuz-2.6.30 root=/dev/sda1 ro init=/bin/fancy
然后程序/bin/fancy
将打印“ Hello world!”。我们不需要外壳。如果您想启动其他程序,只需通过man 2 fork
和生成一个新进程man 2 execve
,或者从终端设备读取并接受用户的输入。仍然不需要外壳。
在我看来,操作系统外壳是一个能够读取用户输入然后启动另一个程序的程序。如果考虑到这一点,那么很明显为什么要编写这样的程序。
即使您不需要交互读取用户的输入,为您的任务编写简单的shell脚本也要方便得多。在这种情况下,它只是存储的shell命令的解释器。您也可以使用其他语言的解释器编写程序。
没有命令行外壳或图形界面的操作系统具有许多其他类型的“面孔”。
嵌入式系统无需任何用户界面即可完成其工作,例如您汽车中的引擎管理系统(您可以通过OBD2接口和合适的终端以某种方式获得它)。或者可能有数字键盘,旋钮或其他任何东西(例如:微波炉,电梯或现代音响系统的面板)。当然,是否将它们视为外壳形式是主观的。
这是一个高水平的秘诀,作为一个业余爱好者,您如何制作一台没有外壳的有用计算机:
很早以前没有外壳的通用计算机就有一些输入方式,例如读取打孔卡。但是,当然必须区分打孔卡:打孔卡是否给计算机一些特殊命令,还是Fortran程序的一部分?因此必须开发“工作控制语言”,这是事实上的命令行。
在使用打孔卡和作业控制语言之前,程序员必须切换开关才能将二进制代码输入到机器中。您可能已经听过老兄的故事,他们不得不“跳进”指令序列以启动引导程序。如今,这种方式仍在某种程度上完成:仍然存在带有跳线或DIP开关的设备,与固件设置相比,这些设备还具有一些优势。