代码之家  ›  专栏  ›  技术社区  ›  Qiu Chaofan

在ARM上编写操作系统时,如何实现x86中的基本输入/输出功能?[已关闭]

  •  0
  • Qiu Chaofan  · 技术社区  · 7 年前

    我试图从头开始编写一个简单的操作系统,以此来提高对操作系统和计算机工作原理的理解。我认为一些概念,如实模式和保护模式,是复杂的,很难保持兼容性。所以我想试着在ARM平台上写这个。

    我发现了一个关于编写ARM操作系统的很棒的教程: Writing a simple OS kernel

    如何输出到真实的“屏幕”?

    编写图形界面确实是一项艰巨的工作,涉及许多主题。但在x86中,我们有BIOS中断调用来将字符输出到屏幕。我使用QEMU来模拟ARM设备。现在我唯一能做的就是从串口(UART)输出或输入,并通过我自己的计算机终端与之交互。有什么办法吗?

    如何接受来自设备的输入?

    普通ARM板具有USB端口,可以连接到键盘。我知道键盘事件会引起干扰。如何通过ARM平台中的USB实现这一点?

    如何创建文件系统?

    如何启动?

    我使用QEMU,它只使用特定的可执行文件名启动。它似乎只是将整个可执行文件“加载”到内存中,然后开始执行指令。但在现实世界中,引导是一个复杂的过程。我在网上搜索了一下,知道一个名为uBoot的引导加载程序。但我感到困惑的是,引导加载程序还需要从文件中找到内核映像,所以它应该能够访问文件系统?

    如果我完成了以上所有事情。现在我的操作系统可以用作玩具。但是我可以在其中编写代码并编译它们吗?我在计算机中使用交叉编译器。但新系统没有可用的编译器。即使我在其中放入了更多的程序,我怎么能像unix调用的那样将它们“加载”到内存中呢 exec

    谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   Community CDub    4 年前

    年。

    如果您有一些简单的LED显示屏,或者一些能够以类似VGA的方式操作的芯片,那么您可能只需要很少的控制寄存器设置,将设备视频内存映射到CPU内存地址空间,然后将位/ASCII写入映射内存。

    x86 BIOS是旧PC XT/AT图形卡的传统,当时几乎没有CGA之类的标准;EGA->VGA和制造商在使用通用驱动程序时相当合理地遵守了这些标准。自windows时代以来,制造商更容易提供自己的封闭源代码驱动程序,并以他们希望的任何方式创建自己的硬件(但出于遗留/启动原因,保持类似VGA的基本功能可用=今天晶体管的价格如何并不成大问题,因此添加数千个晶体管来模拟VGA是可能的)。

    如何接受来自设备的输入?

    同样,您需要编写第一个USB驱动程序,它将处理ARM设备侧的USB总线,然后特定的USB设备需要它自己的驱动程序,像键盘这样的常见设备系列是通用的,单个驱动程序可以处理所有这些设备。

    还有一些读卡器,你需要读卡器的文档,看看如何操作它,它很可能会有一些块设备,比如API来访问卡,从那里它应该合理地类似于任何其他块设备操作(如果你熟悉我所说的“块设备”,数据块,比如扇区)。

    但SD卡的文件系统和普通磁盘的文件系统有什么区别吗?

    如何制作程序?

    即使我在其中放入了更多的程序,我如何像unix call exec那样将它们“加载”到内存中?

    "Hurd" 已经在这项工作中只有27年了,而且进展很好。。。


    说真的,正如一个人展示的那样,你可以创建一个“玩具操作系统”(除非你想在你的项目上花费几十年)。如果你只是想学习一些关于操作系统架构和计算机的新知识,在我看来,你正在学习linux的源代码,并且很少阅读关于这个主题的书籍,可能会在更短的时间内给你带来更多。