我正在尝试从头开始编写一个简单的操作系统,以此来提高对操作系统和计算机工作原理的理解。我认为实际模式和保护模式等一些概念在保持兼容性方面很复杂且很重要。所以我想尝试在ARM平台上写这个。
我找到了一篇关于编写ARM操作系统的精彩教程:Writing a simple OS kernel。我仔细阅读了它,知道如何使用串口输出到QEMU终端并更改CPU模式。然而,与“操作系统”和其他关于在x86平台上编写OS的材料相比,我发现在ARM上如何实现这些内容的文章很少。
如何输出到真正的'屏幕'?
编写图形界面非常辛苦,与许多主题相关。但是在x86中我们有BIOS中断调用来将字符输出到屏幕。我使用QEMU多功能来模拟ARM设备。现在我唯一能做的就是从串口(UART)输出或输入,并通过我自己的计算机终端与它进行交互。有没有办法做到这一点?
如何接受来自设备的输入?
常见的ARM板有USB端口,可以连接到键盘。我知道键盘事件会引发中断。如何通过ARM平台上的USB实现这一目标?
如何制作文件系统?
由于几乎没有人在ARM设备上使用真正的“硬盘”,所以我想选择SD卡(MMC)作为操作系统上的存储项。我用文件作为磁盘编写了一个简单的文件系统模拟器。所以我知道文件系统中的概念。但SD卡的文件系统和普通磁盘的文件系统之间有什么区别吗?
如何开机?
我使用QEMU,它只使用特定的可执行文件名启动。它似乎只是将整个可执行文件“加载”到内存中并开始执行指令。但在现实世界中,启动是一个复杂的过程。我搜索了互联网并知道一个名为uBoot的bootloader。但令我感到困惑的是,引导程序还需要从文件中查找内核映像,因此它应该能够访问文件系统吗?
如何制作节目?
如果我完成了以上所有事情。现在我的操作系统可以用作玩具。但我可以在其中编写代码并编译它们吗?我在计算机中使用交叉编译器。但新系统没有可用的编译器。即使我已经添加了更多程序,如何将它们“加载”到内存中,就像unix调用exec
那样?
这些问题现在让我很困惑,我找不到关于这些主题的好答案或材料。那么我目前的思维方向是错误的吗?或者只是为了学习而写一个基于x86的文件会更好吗?
感谢。
答案 0 :(得分:2)
如何输出到真实'屏幕'?
取决于您连接的屏幕类型,如果您有某种图形卡,那么您需要该卡的文档(对于任何具有市场竞争力的产品,通常可以从卡制造商处根据签署的NDA获得),并编写您自己的驱动程序根据它。要创建完全成熟的图形驱动程序,也支持一些复杂的API,如OpenGL和类似的,期望编写自己的驱动程序的工作在人 - 年。
如果您有一些简单的LED显示屏,或者某些芯片能够以与VGA类似的方式工作,那么您可以通过几乎没有控制寄存器设置,在CPU内存地址空间中映射设备视频内存,然后写入位/ ASCII到该映射的内存中。
x86 BIOS是旧PC XT / AT显卡的遗留产品,当确实存在很少的标准时,如CGA - > EGA - > VGA和制造商非常合理地遵守使用通用驱动程序的标准。自Windows时代开始,制造商就可以更容易地提供他们自己的闭源驱动程序,并以他们希望的任何方式创建自己的硬件(但保留类似VGA的基本功能可用于遗留/启动原因=不是一个大问题今天晶体管是如何便宜的,所以可以添加几千个晶体管来模拟VGA。)
如何接受来自设备的输入?
再次,您需要编写第一个USB驱动程序,它将处理ARM设备端的USB总线,然后特定的USB设备需要它自己的驱动程序,其中常见的设备系列如键盘是通用的单个驱动程序可以处理所有这些的点。
如何制作文件系统?
同样有一些读卡器,你需要该读卡器的文档并看看如何操作它,它很可能会有一些类似块设备的API来访问卡,从那里它应该是相当类似的任何其他块设备操作(如果你是* NIX熟悉我的意思"阻止设备",数据块如扇区)。
但SD卡之间有什么区别吗?文件系统和普通磁盘'文件系统?
作为操作系统创建者,您可以自己决定,您将从普通方案中转移多少,但卡片通常具有逻辑扇区(块),就像旧硬盘一样,因此良好的驱动程序设计隐藏了背后的任何细节。块" API对于FS代码来说将是同样的事情。闪存盘驱动程序的主要区别在于,它们通常允许与某些文件系统配合使用以获得额外的额外功能,例如在删除块时修剪可用空间以节省写入。
如何开机?
在现实世界中,它取决于主板和它的芯片组,它如何初始化ARM CPU,以及是否启动某些固件以及从何处启动。可能每个主板都会有某种" BIOS"在某种ROM内存中,它会在定义的位置(通常是某些类似磁盘的设备或具有网络启动功能)搜索更多用户代码(引导加载程序)。
如何制作节目?
即使我已经添加了更多的程序,我怎样才能加载'就像unix调用exec那样,它们进入内存?
那么,您的操作系统的责任,提供所有流程启动管理,并为应用程序提供定义的API。除非您想编写自己的编译器,否则可以使用一些像gcc / clang这样的开源编译器,但这意味着您必须实现大多数* NIX OS API服务。不要担心,这并不是那么难,例如GNU内核"Hurd"已经工作了27年,并且很好地形成了......
说真的,作为单人秀,你可以创造一个玩具操作系统" (除非你想在你的项目上花费数十年)。如果你只想学习一些关于操作系统架构和计算机的新东西,那么在我看来,你正在研究linux的源代码,阅读关于这个主题的几本书,可能会在更短的时间内给你更多。 / p>