你如何创建一个独立的C++程序?

Bob*_*lan 10 c++

我只是想知道如何用C++创建一个独立程序?

编辑:独立我指的是一个不在托管环境中运行的程序(例如操作系统).我希望我的程序成为计算机加载的第一个程序,而不是操作系统.

Phi*_*lMY 11

看看这篇文章:

http://www.codeproject.com/KB/tips/boot-loader.aspx

你需要一个小的汇编启动代码来使你到main(),然后你可以用C++编写其余的.如果要在运行时创建对象,则必须编写自己的堆管理器(new/delete),如果需要多个线程,则必须编写自己的调度程序.


Jer*_*fin 5

遗留系统

即使您进行了澄清,答案仍然是这取决于 - 确切的启动顺序取决于硬件 - 尽管有相当多的共性。引导加载程序通常加载到绝对地址,并且它包含的文件经常按原样读入内存。这意味着您通常使用“链接定位器”而不是普通链接器。典型的链接器生成一个可供重定位和加载的可执行文件,而定位器则生成一个已设置为在一个确切地址运行的可执行文件,并且已应用所有重定位。对于那些能够记住它们的人来说,它通常非常类似于 MS-DOS .COM 文件。

除此之外,它(当然)必须静态链接程序所依赖的整个运行时——它不能依赖于诸如 DLL 或共享对象库之类的东西,因为加载其中任何一个的代码都没有。 t 本身还没有被加载。

电喷/UEFI

当前的 PC(和 Mac)使用 EFI/UEFI。我将在本文的其余部分中仅提及 UEFI,但其中大部分也同样适用于 EFI(但 UEFI 更为常见)。

这些为引导代码提供了更多的支持。这包括大多数设备的驱动程序(它支持安装设备驱动程序),因此您的引导代码可以使用网络等,这在传统模式下更难以支持。

EFI 下的可启动代码使用与 Windows 可执行文件相同的 PE 格式。库也可用,因此可以编写相当多的引导代码,就像在操作系统内运行的普通代码一样。我不会尝试详细介绍,但这里有一些信息的链接。

https://www.intel.com/content/www/us/en/developer/articles/tool/unified-extensible-firmware-interface.html

https://www.intel.com/content/dam/doc/guide/uefi-driver-network-boot-devices-guide.pdf

https://www.intel.com/content/dam/www/public/us/en/documents/guides/bldk-v2-uefi-standard-based-guide.pdf

也许最重要的是开发套件:

https://github.com/tianocore/edk2

统一内核

为了使这更容易和更实用,通常最简单的方法是从所谓的“unikernel”开始。这基本上是一组作为库实现的类似操作系统的原语,因此当您链接程序时,必要的操作系统原语将直接链接到其中,因此它可以在裸机上(或者通常在虚拟机中)启动。

IncludeOSUniKraft就是这方面的几个例子。IncludeOS 通常会要求您专门为其编写新代码。UniKraft 更接近于 POSIX 实现,因此它可以运行相当多的现有软件(例如 nginx、redis)。


Eva*_*ran 5

请参阅此页面:http://wiki.osdev.org/C++

它拥有使用c ++作为核心语言使用更流行的工具链开始编写操作系统所需的一切.

此外,此页面应该非常有用:http://wiki.osdev.org/C++_Bare_Bones.它几乎引导您进入操作系统的c ++入口点.