c - 来自用户的字符串输入
问题描述
我正在制作一个命令行操作系统(命令行解释器)。如何从用户那里获得一行输入?
解决方案
我正在制作一个命令行操作系统。如何从用户那里获得一行输入?
您需要的第一件事是一些引导代码(从固件中获取内存映射等内容)、物理内存管理、虚拟内存管理、调度程序和某种进程间通信 (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”、“删除”、“退格”等),以便所有程序(包括命令外壳本身)都可以使用这些库。
推荐阅读
- python - 使用python将“类似字符串”的列表转换为int
- shell - Shell dash for 循环跳过前两个参数
- java - 通过 TLS 与外部系统握手时如何启用椭圆曲线扩展?
- mysql - Sequelize 在种子运行时插入新记录而不是更新以前的记录
- swiftui - geometryReader 滑动时图像闪烁
- c++ - 堆排序 C++ 调试
- windows - 如何检查 IIS APP 是否在调试模式下生成
- ruby-on-rails - 弹性搜索边缘图未正确搜索
- javascript - 如何获取 JSON(来自 Dynamics 365 Business Central API 的 OData)并访问其元素以在本地存储
- assembly - 尝试使用系统调用 gettimeofday() 在 armv7l 上的汇编中获取伪随机数,但系统调用上的寄存器变为 0?