首页 > 解决方案 > 来自用户的字符串输入

问题描述

我正在制作一个命令行操作系统(命令行解释器)。如何从用户那里获得一行输入?

标签: cinput

解决方案


我正在制作一个命令行操作系统。如何从用户那里获得一行输入?

您需要的第一件事是一些引导代码(从固件中获取内存映射等内容)、物理内存管理、虚拟内存管理、调度程序和某种进程间通信 (IPC)。

接下来需要的是某种设备枚举框架,以帮助创建设备树来跟踪所有内容;然后扫描 PCI 总线以将它们添加到设备树中。

接下来,您需要处理设备资源——确定 IO 端口范围、内存映射 IO 范围和管理 IRQ。这可能很混乱(例如,ACPI 的 AML 解释器确定 IO APIC 输入,以及处理 MSI 的“中断向量分配器”)。

接下来是 USB 控制器驱动程序、USB 集线器驱动程序和可能(对于过时的硬件)PS/2 控制器驱动程序。这些都找到连接到它们的设备(例如USB键盘)并将它们添加到设备树中,然后与这些设备的驱动程序进行通信。在某些时候,您可能还需要担心容错、电源管理和热插拔(例如,如果 USB 控制器驱动程序崩溃、进入睡眠状态或被移除/拔出;那么您将使用“设备树”来找出哪些其他驱动程序受到影响)。

接下来,您需要键盘驱动程序。具体来说,“USB HID”的驱动程序(这是一个涵盖所有人类输入设备的单一规范 - 键盘、鼠标、触摸板、操纵杆等),并且可能(对于过时的硬件)PS/2 键盘驱动程序。请注意,您可能还需要一个用于触摸屏用户的屏幕键盘,以及用于协助输入某些语言(中文、日文、韩文等)的输入法编辑器。

接下来,您需要一些用于视频输出的东西。通常,早期启动代码使用最少的“刚好足以显示启动日志”代码(如果它没有被漂亮的启动图像隐藏);但是您会想要一些实际上很好的东西(可能包括支持 Unicode 的字体引擎)。

以上所有内容的最终结果是,您将拥有一组(希望“为您的操作系统标准化”并记录在案的)设备驱动程序接口以及设备驱动程序所依赖的所有东西;一种向进程发送“事件”(按键)的方式(我在开始时提到的进程间通信)以及一种让进程显示输出的方式(在屏幕上绘制内容)。

完成所有这些后,您就可以编写终端仿真层了。这是一个东西(过程?),它将所有漂亮的现代东西(例如 OpenGL,事件)隐藏在一层历史纪念品之下(这样最终用户的计算机,可能能够模拟现实的虚拟现实环境,可以从上个世纪初开始用作美化的电传打印机)。这也使用了我在开头提到的进程间通信(例如,可能是管道 - 标准输入、标准输出)与子进程进行通信。

最后,您可以开始编写某种命令 shell。这只是一个通过它与父级(例如与终端仿真层)通信的进程。无论您使用什么进行进程间通信(例如 stdin、stdout),它都允许用户启动其他进程并处理一些“转发”(例如,当子进程正在运行时,shell 从终端仿真层接收的键盘输入被转发通过 shell 到其子进程,并且 shell 从其子进程接收的输出由 shell 转发回 shell 的父/终端仿真器)。

请注意,作为编写命令 shell 的一部分,或者在编写命令 shell 之前,您可能想要编写一些库来处理简单的琐事(例如,获取一整行用户输入并处理诸如“home”、“end”、“删除”、“退格”等),以便所有程序(包括命令外壳本身)都可以使用这些库。


推荐阅读