【问题标题】:Creating SDK/API (for Application Development) for My Own OS为我自己的操作系统创建 SDK/API(用于应用程序开发)
【发布时间】:2021-09-15 12:42:21
【问题描述】:

我创建了一个简单的操作系统。我想为其创建外部应用程序,它应该已经编译为 elf 可执行文件并且可以在我的操作系统上运行,我不知道创建 API 或 SDK 以成功编译应用程序。如何在不包含 OS 头文件的情况下使应用程序能够使用 OS 内置类和函数。

像 Windows 或其他的应用程序。

我是否需要像 .dll 这样的动态库(在 Windows 中)?那我该怎么办呢?

【问题讨论】:

    标签: c++ api gcc sdk operating-system


    【解决方案1】:

    如果应用程序是指设备驱动程序,则它相当复杂,因为您需要在启动时将它们与内核链接。例如,在 Linux 上,大多数驱动程序都是作为模块编写的,放置在特定目录中。这些模块是特殊的 elf 文件,在引导时与内核链接。内核知道它的不同函数在哪里,因此它在启动时使用文件中的重定位条目将特殊 elf 文件中的函数调用与内核链接。

    对于一个应用程序来说,它更简单,但要使其与在 Linux 上编译的 elf 文件兼容,您需要遵循 System V ABI,它规定了内核的系统调用接口。要么就是这样,要么您必须编写自己的特定于您的操作系统的编译器。

    我自己正在编写一个小内核。我会给你一些我的设计选择。这样我就可以告诉你我打算如何做事,同时提供有关它如何工作的信息。

    编译 C++

    我的计划是为内核编写一个全新的系统调用接口。因此,我必须编写一个完整的 C++ 编译器才能运行 C++ 应用程序。通常,它的工作原理是操作系统提供包含 C++ 函数定义的库。因此,C++ 标头中的所有函数(您可以从 g++ 或其他地方获得)都与您的操作系统提供的 C++ 库链接。这些函数定义特定于一个操作系统或一组遵循某些约定(如 System V)的特定操作系统。由于我打算不遵循任何约定,我将不得不重新发明轮子并制作一个新的编译器来在我的操作系统上工作。

    C++ 应用程序还与启动应用程序所必需的多个文件相关联。 crt0.s 汇编文件提供了 _start 符号。此 crt0.s 文件包含几项内容,其中包括对 C++ 应用程序的全局构造函数的调用。您可以阅读以下内容了解更多信息:https://wiki.osdev.org/Creating_a_C_Library

    必须调用全局构造函数,否则将永远无法构造全局对象。全局对象构造不在函数的路径中。因此它永远不会被执行。在我的内核中,我没有添加任何启动文件,因为我将内核的入口点指定为 main 并且我没有全局对象。因此,我决定不需要它们。我确实计划通过实现这些启动文件使这些对用户模式可用。

    用户输入

    每个操作系统都需要一种将用户输入传递给应用程序的方法。大多数时候,它是特定于操作系统的,因为 C++ 的用户输入功能还不够好。例如,在我的内核中,我计划拥有类似于 windows 的东西。 Windows 上的每个应用程序都在循环调用一些函数。这些函数将轮询消息队列中的消息,然后以消息作为参数调用程序员提供的过程。

    基本上,当操作系统检测到输入时,它会将消息放入当前具有焦点的应用程序的消息队列中,说明输入的内容。然后此应用程序轮询此队列以获取消息。当它找到一个时,它将以消息作为参数调用该过程。然后,该过程会根据消息在应用程序中执行某些操作。

    帧缓冲区

    对于绘图,它非常复杂,尤其是如果您想要支持显卡。我计划如何实现仅支持 UEFI 提供的帧缓冲模式。基本上,我的操作系统只会使用 GOP 提供的帧缓冲区。

    我的操作系统将提供一个以操作系统名称命名的库,该库将具有 DrawFramebuffer() 函数。用户模式应用程序将简单地在用户模式下拥有一个大缓冲区,其中包含每个像素的 RGB 颜色,然后调用 DrawFramebuffer() 函数,该函数在内核中使用用户模式缓冲区的地址和大小作为参数进行系统调用。它还将提供一个 GetFramebufferSize() 函数来获取帧缓冲区的大小。因此,内核将根据用户应用程序可以访问屏幕的哪个部分来决定绘制该用户模式缓冲区的哪一部分以及不绘制哪一部分。

    在这种情况下比较简单,但是要支持更多的显卡就比较复杂了。您将需要对显卡驱动程序的支持,并且可能需要某种将桌面写入屏幕的方法。最后,如果您不知道驱动程序是如何工作的,您应该如何将桌面绘制到屏幕上?这就是为什么我计划在我的最小内核中只支持帧缓冲区。

    要回答您的问题,除非您提供调用内核的常规方式(例如遵循 System V ABI),否则一切都是特定于操作系统的。此外,用户输入和绘图始终是特定于操作系统的。例如,在 Linux 上,它与 Windows 类似地与 X 服务器一起工作。您为 X 服务器创建一个客户端并轮询服务器以确定您的应用是否有消息(如键盘输入)。

    【讨论】:

    • 是否有任何开源操作系统或示例可以做到这一点?
    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多