【问题标题】:How do I create a text wrapper for the kernel? [closed]如何为内核创建文本包装器? [关闭]
【发布时间】:2021-02-20 14:49:54
【问题描述】:

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

【问题讨论】:

    标签: c osdev


    【解决方案1】:

    如何使用命令为内核创建原始文本外壳?

    正确的做法是:

    • 编写足够多的内核代码来管理各种资源(内存、IRQ、IO 端口、DMA 通道……)。这应该包括管理时间(调度程序),还应该包括某种进程间通信(以便调度程序可以被告知“不要给这个任务更多的 CPU 时间,直到/除非它从进程间接收数据沟通”)。

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

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

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

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

    • 使用简单的主循环创建一个任务,该循环使用进程间通信(“不要给我更多的 CPU 时间,直到/除非我从键盘接收到数据”)并处理它接收到的数据以建立当前命令字符串,然后(如果/当用户按下回车键)解析命令字符串并执行命令所说的任何操作。请注意,如果您走到这一步,很可能会做一些额外的工作来支持用户空间,并使其成为正常进程而不是内核任务。

    错误的方式是:

    • 没有支持设备驱动程序和其他代码必须依赖的部分/大部分内容的内核

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

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

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

    • 在您让外壳“工作”后,不要继续在操作系统上工作。这将是必要的,因为代码太不灵活和太脆弱(任何尝试做任何其他事情都会导致您必须重写所有内容)。

    注意:根据我的经验,问“我如何编写内核外壳”之类的问题的人可能会跳过所有重要的事情(因为如果他们已经完成了外壳程序的所有工作,他们就会知道如何编写外壳程序。取决于);并且如此专注于拥有一个 shell,以至于他们很想以错误的方式做这件事(然后被卡住并后悔)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2022-01-07
      • 2016-02-28
      • 2020-01-30
      相关资源
      最近更新 更多