c-如何为内核创建一个文本包装器



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

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

正确的方法是:

  • 编写足够的内核代码来管理各种资源(内存、IRQ、IO端口、DMA通道等)。这应该包括管理时间(调度器),还应该包括某种进程间通信(这样调度器就可以被告知"在/除非它从进程间通信接收到数据,否则不要再给这个任务CPU时间")。

  • 枚举设备,确定每个设备的资源,并启动找到的任何设备的驱动程序。请注意,这是分层的。例如,如果您枚举PCI总线,找到2个连接到PCI总线的USB控制器并启动它们的设备驱动程序,那么您需要枚举每个USB控制器,以找到连接到USB总线的任何USB设备,并且可能找到3个USB集线器,然后您需要枚举所有3个USB枢纽,以查看它们中插入了什么。所有这些都应该通过某种";设备管理器";它跟踪设备的层次树,以便(例如)如果设备被拔出或发送到节能状态(或者如果其设备驱动程序崩溃),您可以通知依赖该设备的驱动程序(例如,如果USB集线器被拔出,您可以告知连接到该集线器的设备的所有驱动程序)。

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

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

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

  • 用一个简单的主循环创建一个任务,该任务使用进程间通信("除非我从键盘接收到数据,否则不要再给我CPU时间"),并处理它接收到的数据以构建当前命令字符串,然后(如果/当用户按enter键时)解析命令字符串并执行命令所说的任何操作。请注意,如果你走到这一步,你很容易做一点额外的工作来支持用户空间,并使其成为一个正常的过程,而不是一个内核任务。

错误的方式是:

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

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

  • 不要考虑设备驱动程序接口。只要把任何看起来方便的东西拼凑在一起(每当你更换任何设备驱动程序时,都会不断地破坏所有东西)。

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

  • 在你得到shell后不要继续在操作系统上工作;工作";。这将是必要的,因为代码将过于灵活和脆弱(任何尝试做其他事情的行为都将导致您不得不重写所有内容)。

注意:根据我的经验,人们会问类似";我该如何编写内核外壳";他们可能跳过了所有重要的内容(因为如果他们完成了shell所依赖的所有内容,他们就会知道如何编写shell);他们如此专注于拥有一个外壳,以至于他们很想用不正确的方式去做(然后陷入困境并后悔)。

相关内容

最新更新