如何为内核创建文本包装器?

How do I create a text wrapper for the kernel?

我学习了osdev.org网站的内容,编译了一个编译器,启动了一个测试内核,但我想,如何用命令为内核创建一个原始文本shell?也许有人可以通过示例向我解释如何实现这一点。网站本身没有什么有趣的东西,当然有一篇文章,但对我来说没用。如果那样的话,我是初学者。

how can I create a primitive text shell for the kernel with commands?

正确的方法是:

  • 编写足够的内核代码来管理各种资源(内存、IRQ、IO 端口、DMA 通道,...)。这应该包括管理时间(调度程序),还应该包括某种 inter-process 通信(以便调度程序可以被告知“不要再给这个任务 CPU 时间 until/unless 它从 inter-process 通讯接收数据").

  • 枚举设备,确定每个设备的资源,并为找到的任何设备启动驱动程序。请注意,这是分层的。例如,如果您枚举 PCI 总线并找到 2 个连接到 PCI 总线的 USB 控制器并启动它们的设备驱动程序,那么您将需要枚举每个 USB 控制器以找到连接到 USB 总线的任何 USB 设备,并且可能会找到 3 个 USB 集线器,然后您需要枚举所有 3 个 USB 集线器以查看插入其中的内容。所有这些都应该由某种“设备管理器”来协调,它跟踪设备的层次树,这样(例如)如果设备被拔掉或发送到省电状态(或者如果它的设备驱动程序崩溃)你可以通知依赖该设备的驱动程序(例如,如果拔下 USB 集线器,您可以通知连接到该集线器的设备的所有驱动程序)。

  • 写入键盘设备driver/s。这些应该解码来自设备的数据(可能使用表格和其他描述从文件系统加载的“键盘布局”的信息)并使用内核的 inter-process 通信发送数据包(这样任何任务都可以说“don在我从键盘驱动程序接收数据之前给我任何 CPU 时间”)。这将涉及设计所有键盘驱动程序(以及所有模拟键盘的软件 - 例如使用触摸屏的人的“屏幕键盘”等)将表现的标准方式(例如他们发送的数据包的格式等);并且可能应该涉及为您的 OS 创建一个正式的“键盘设备驱动程序接口”规范来描述您设计的任何内容(除了为“键盘布局文件”设计文件格式之外)。

  • 写入视频设备driver/s。这还将包括为您的 OS 设计合适的视频驱动程序接口(并且应该包括编写描述它的正式规范)。然而;视频很复杂,你可以通过只设计视频驱动程序接口的一部分并将其余部分(视频模式设置、3D、GPGPU 等)留到以后来作弊。这同样适用于视频驱动程序本身 - 您将希望从“通用原始帧缓冲区驱动程序”(仅使用由引导加载程序配置的帧缓冲区)开始,并且可能不会为特定视频卡编写实际驱动程序。

  • (可选)写某种上层来控制每组用户input/output设备哪个任务是主任务。这允许用户拥有多个虚拟控制台并在它们之间切换(例如,可能使用“control+alt+F1”到“control+alt+F12”),可能允许一些虚拟控制台与终端相关联,而其他虚拟控制台与终端相关联不同的图形用户界面。它还可以轻松支持“多席位”(例如,如果有 2 个键盘和 2 个显示器,那么您可以有 2 个完全独立的用户,每个用户有一个键盘和一个显示器)。

  • 创建一个带有使用 inter-process 通信的简单主循环的任务(“不要再给我 CPU 时间 until/unless 我从键盘”)并处理它接收到的数据以构建当前命令字符串,然后(if/when 用户按下回车键)解析命令字符串并执行命令所说的任何操作。请注意,如果你做到这一点,很容易做一些额外的工作来支持 user-space,并使其成为正常进程而不是内核任务。

错误的方法是:

  • 没有内核支持 some/most 设备驱动程序和其他代码必须依赖的东西

  • 不要进行任何类型的设备枚举。相反,对存在哪些设备以及它们使用哪些资源做出大胆的假设。

  • 不要考虑设备驱动程序接口。把任何看起来方便的东西放在一起(并且在你改变任何设备驱动程序时不断地破坏一切)。

  • 不使用任务(或inter-process通信)。相反,将“shell”构建到键盘驱动程序的 IRQ 处理程序中,以确保当有人输入任何耗时的命令时整个 OS“暂停”。

  • 在 shell 开始“工作”后,不要继续在 OS 上工作。这将是必要的,因为代码太不灵活且太脆弱(任何尝试做任何其他事情都会导致您不得不重写所有内容)。

注意:根据我的经验,问“我如何编写内核 shell”之类的问题的人可能会跳过所有重要的内容(因为他们知道如何编写 shell 如果他们已经完成了 shell 所依赖的一切);并且如此专注于拥有 shell,以至于他们很想以不正确的方式去做(然后卡住并后悔)。