gpt4 book ai didi

linux - 在 ARM 上编写操作系统时,如何像在 x86 中一样实现基本的 I/O 功能?

转载 作者:太空宇宙 更新时间:2023-11-04 09:17:11 25 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




我正在尝试从头开始编写一个简单的操作系统,以提高对操作系统和计算机工作方式的理解。我认为实模式和保护模式等一些概念很复杂,并且在保持兼容性方面很重要。所以我想尝试在ARM平台上写这个。

我找到了一个关于编写 ARM 操作系统的很棒的教程:Writing a simple OS kernel .我通读了大部分内容,知道如何使用串口输出到 QEMU 终端并更改 CPU 模式。然而,与普通意义上的“操作系统”和其他关于在x86平台上编写操作系统的 Material 相比,我发现关于如何在ARM上实现这些东西的文字很少。

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

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

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

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

如何制作文件系统?

由于几乎没有人在 ARM 设备上使用真正的“硬盘”,所以我想选择 SD 卡 (MMC) 作为操作系统上的存储项目。我已经使用文件作为磁盘编写了一个简单的文件系统模拟器。所以我知道文件系统中的概念。但是 SD 卡的文件系统和普通磁盘的文件系统有什么区别吗?

如何开机?

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

如何制作程序?

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

这些问题现在对我来说真的很困惑,我找不到关于这些主题的好的答案或 Material 。那我现在的思维方向是不是错了?或者如果只是为了学习,写一个基于x86的更好?

谢谢。

最佳答案

How to output to real 'screen'?


取决于您连接的屏幕类型,如果您有某种图形卡,那么您需要该卡的文档(对于任何具有市场竞争力的产品,通常可以从卡制造商处获得签署的 NDA),并根据它编写自己的驱动程序.要创建完全成熟的图形驱动程序,还支持一些复杂的 API,如 OpenGL 和类似的,需要人工编写自己的驱动程序。
年。
如果你有一些简单的 LED 显示器,或者一些能够以类似 VGA 的方式运行的芯片,那么你可能只需很少的控制寄存器设置,将设备视频内存映射到 CPU 内存地址空间,然后将位/ASCII 写入其中映射内存。
x86 BIOS 是旧 PC XT/AT 显卡的遗留物,当时几乎没有标准存在,例如 CGA -> EGA -> VGA,并且制造商非常合理地遵守标准以使用通用驱动程序。自 Windows 时代以来,制造商更容易提供自己的闭源驱动程序并以他们希望的任何方式创建自己的硬件(但保持类似 VGA 的基本功能可用于遗留/启动原因 = 今天晶体管的方式不是一个大问题很便宜,所以添加几千个来模拟 VGA 是可能的)。

How to accept input from devices?


再次,您需要编写第一个 USB 驱动程序,它将处理 ARM 设备端的 USB 总线,然后特定的 USB 设备需要它自己的驱动程序,像键盘这样的常见设备系列通用到单个驱动程序可以处理的程度~他们都是。

How to make a filesystem?


再次有一些读卡器,您需要该读卡器的文档并查看如何操作它,它很可能有一些类似 block 设备的 API 来访问卡,从那里它应该与任何其他 block 设备操作相当相似(如果您*NIX 熟悉我所说的“ block 设备”,数据 block 如扇区)。

But is there any difference between SD cards' filesystem and normal disks' filesystem?


作为操作系统创建者,您可以自己决定,您将从常见的事物方案中转移多少,但卡通常像旧硬盘一样具有逻辑扇区( block ),因此通过良好的驱动程序设计隐藏“ block ”API后面的任何细节将是FS 代码也是如此。闪存驱动程序的主要区别在于,它们通常允许与某些文件系统合作以获得额外的附加功能,例如在删除 block 时修剪可用空间以节省写入。

How to boot?


在现实世界中,这取决于主板和它的芯片组,它如何初始化 ARM CPU,以及某些固件是否启动以及从哪里启动。可能每 block 主板都会在某种 ROM 存储器中具有某种“BIOS”,它将在定义的位置(通常是一些类似磁盘的设备或具有网络启动功能)搜索更多的用户代码(引导加载程序)。

How to make a program?

Even I have put more programs into it, how can I 'load' them into memory just as what unix call exec does?


嗯,这是你的操作系统的责任,提供所有进程启动管理,并为应用程序提供定义的 API。除非您想编写自己的编译器,否则可以使用 gcc/clang 之类的开源编译器,但这意味着您必须实现大多数 *NIX OS API 服务。别担心,这并不难,例如 GNU 内核 "Hurd"从事这项工作仅 27 年,而且发展良好……

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

关于linux - 在 ARM 上编写操作系统时,如何像在 x86 中一样实现基本的 I/O 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46025508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com