首页 > 解决方案 > 无操作系统电脑上的 C++ 程序

问题描述

最近,我决定学习一门新的编程语言,我知道 C++(这是我要学习的语言)真的很好而且很快。(快速执行)

现在我有一个关于 C++(也许是 C)的问题

是否有可能制作一个在每台设备上运行的程序?

就像绕过操作系统并直接在 CPU 上运行命令/0 和 1?

或者

在没有安装操作系统的计算机上运行,​​例如创建自己的操作系统?

如果可能的话,.exes(windows 可执行文件)和无操作系统支持的程序有什么区别?(在编译和作为文件的文件上)

标签: operating-system

解决方案


C 比 C++ 更老,但你是对的,它类似于 C++,因为它被编译为二进制代码。当您编写 C/C++ 程序时,您使用编译器将其编译为二进制文件。

今天,大多数台式计算机运行在从 Intel 的 8086 开始的 x86 架构处理器的变体上。x86 处理器有据可查。我从来没有实现过汇编程序,所以我不能确切地知道如何从高级代码(C/C++)到二进制,但我可以链接到告诉你如何做到这一点的文档。这里有英特尔软件开发人员手册的下载链接:https ://software.intel.com/content/www/us/en/develop/download/intel-64-and-ia-32-architectures-sdm-combined -volumes-1-2a-2b-2c-2d-3a-3b-3c-3d-and-4.html。本下载链接第2卷附录B有指令编码说明。这是指令格式的图片:

英特尔指令编码

在 x86(以及所有其他架构,如 ARM)上,指令具有编译器知道的某种常规编码,并将用于将高级代码编译为二进制代码。今天,当您编写操作系统时,您会使用屏幕和编译器以及其他现成的工具来编译成二进制代码。使用 Linux 上的 gcc/g++,您拥有独立和静态标志,允许将所有代码包含在最终可执行文件中,并确保代码是独立的。

如果您在 Linux 上编写代码并想开发操作系统,则需要非常了解 C/C++,因为您不能使用任何依赖于标准库(如 printf() 或 cout)的东西。这意味着您只剩下基本的 C/C++ 之类的指针(非常重要)和函数调用以及其他东西。您需要非常了解该语言如何正确控制内存以及不能使用取决于操作系统存在的语言内容。

.exe 文件是包含二进制代码的传统格式。.exe 文件的 Linux 等效文件是 .elf 文件。将操作系统编译为 .exe 文件(或 .elf 文件)并从引导加载程序解析该文件以跳转到其入口点并没有错。不同之处在于您需要告诉您的编译器,并且您需要编写一个不依赖于操作系统的存在才能工作的程序(因为您是编写操作系统的人)。因此,您只剩下基本的 C/C++,如指针和结构。使用 C++,您也可以使用类,因为它们被编译为函数调用。

要使独立的 C/C++ 代码正常工作,您需要使用 CPU 的 RSP 寄存器设置硬件堆栈。这将允许您的代码调用函数(除了 main())。独立的 C/C++ 代码依赖于堆栈的存在,但没有其他东西可以正常工作,因为您编写的所有高级代码行都将被编译为不依赖于其他任何东西的 CPU 指令。如果你愿意,你甚至可以忘记堆栈并在主函数中做所有事情而忘记函数。因此,您将留下指针和结构。我认为最低限度是具有功能,以便您可以正确组织代码。Linux 实际上只是一个独立的、静态链接的 C 程序,编译为 .elf 文件并使用 gzip 压缩。Linux 遵循多重引导规范,该规范告诉如何引导它。这意味着,要编写 Linux,开发人员只使用指针、结构和函数。指针被编译为内存获取代码,该代码本身就是一条指令。结构被编译成数据。函数被编译为相对跳转(短跳转)、弹出和推送指令(使用堆栈作为参数)。这差不多。

您绝对可以编写自己的操作系统,否则微软将如何开发 Windows。要编写操作系统,您需要使用随心所欲的工具并编译独立和静态代码。然后,您需要编写自定义引导加载程序,如汇编中的传统引导加载程序或使用 EDK2 等专用工具编译的 C 语言的 UEFI 引导加载程序。EDK2 是 UEFI 引导加载程序的编译器。拥有 EFI 应用程序后,您可以启动该应用程序并从该应用程序解析静态链接的独立 .elf 文件(或 .exe 文件)。然后你可以跳转到那个 .elf 文件的入口点。您可以使用 UEFI 环境从硬盘加载 .elf 文件。

记住您上次安装操作系统的时间。您基本上使用微软的媒体创建工具之类的工具在 USB 记忆棒上编写一个小型操作系统。然后,您选择该 USB 记忆棒从 BIOS 启动,并将操作系统安装到硬盘上。开发和操作系统是一样的。您使用现有的编译器和现有的操作系​​统来编写自定义操作系统代码。然后将该代码写入 U 盘(或硬盘),然后测试代码。更好的选择是仿真。您可以使用 QEMU 或 Virtual Box 等专门的虚拟化软件来测试您的自定义操作系统。


推荐阅读