c++ - 如何创建可执行文件以在特定处理器架构(而不是特定操作系统)上运行?

标签 c++ c compilation executable processor

所以我在 Visual Studio 中使用我的 C++ 程序进行编译,它会生成一个漂亮的小 EXE 文件。但是 EXE 只能在 Windows 上运行,而且我听到很多关于 C/C++ 如何编译成汇编语言的信息,它直接在处理器上运行。 EXE 在 windows 的帮助下运行,或者我可以有一个程序来制作在 mac 上运行的可执行文件。但是,我不是将 C++ 代码编译成特定于处理器的汇编语言吗?

我的见解:

  1. 我想我可能不是。我知道有一个英特尔 C++ 编译器,那么它会生成特定于处理器的汇编代码吗? EXE 在 Windows 上运行,因此它们可以利用大量已经设置好的东西,从图形包到庞大的 .NET 框架。特定于处理器的可执行文件实际上是从头开始的,只有处理器的指令集。

  2. 这个可执行文件是文件类型吗?我们可以运行 windows 并打开它,但之后是否会控制切换到处理器?我假设这个可执行文件类似于操作系统,因为它必须在启动其他任何东西之前运行,并且只有处理器指令设置为“使用”。

最佳答案

让我们想想“跑”是什么意思……

有些东西必须将二进制代码加载到内存中。这是一个操作系统功能。 .EXE 或二进制可执行文件或 bundle 或其他任何内容以非常特定于操作系统的方式进行格式化,以便操作系统可以将其加载到内存中。

有些东西必须将控制权交给那些二进制代码。又是操作系统。

I/O 例程(在 C++ 中,但在大多数地方都是如此)只是一个封装操作系统 API 的库。讨厌那个操作系统,它无处不在。

记忆

在过去(是的,我已经这么老了)我在没有操作系统的机器上工作。我们也没有 C。

我们使用“汇编器”和“链接器”等工具编写机器代码,以创建可以加载到机器中的大型二进制图像。我们不得不通过痛苦的引导过程加载这些二进制图像。

我们会使用前面板键将足够的代码加载到内存中,以读取穿孔纸带阅读器等可移植设备。这将加载一小段相当标准的引导链接加载程序软件。 (我们使用了聚脂薄膜胶带,这样它就不会磨损。)

然后,当我们在内存中有这个链接加载器时,我们可以将我们之前准备好的磁带与汇编程序一起提供。

我们编写了自己的设备驱动程序。或者我们使用源代码形式的库例程,在纸带上打洞。

“补丁”实际上是用纸带打补丁。此外,由于还有一些小错误,我们必须根据手写说明调整内存镜像——没有放入磁带的补丁。

后来,我们有了简单的操作系统,其中包含简单的 API、简单的设备驱动程序和一些实用程序,如“文件系统”、“编辑器”和“编译器”。它是针对一种叫做 Jovial 的语言,但我们有时也使用 Fortran。

我们必须焊接串行接口(interface)板才能插入设备。我们必须编写设备驱动程序。

底线

您可以轻松编写不需要操作系统的 C++ 程序。

  1. 了解作为处理器芯片组一部分的硬件 BIOS(或类似 BIOS)设施。大多数现代硬件都有一个连接到 ROM 的简单操作系统,该操作系统执行开机自检 (POST)、加载一些简单的驱动程序并定位引导 block 。

  2. 了解如何编写您自己的引导 block 。这是在 POST 之后加载的第一个正确的“软件”。这并不难。您可以使用各种分区工具将您的引导 block 程序强制到磁盘上,您将完全控制硬件。没有操作系统。

  3. 了解 GRUB、LILO 或 BootCamp 如何启动操作系统。这并不复杂。一旦启动,他们就可以加载您的程序,然后您就可以开始运行了。这稍微简单一些,因为您创建了引导加载程序想要加载的分区类型。以 Linux 内核为基础,你会更快乐。不要试图弄清楚 Windows 是如何启动的——它太复杂了。

  4. 阅读 ELF。 http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

  5. 了解如何编写设备驱动程序。如果您不使用操作系统,则需要编写设备驱动程序。

关于c++ - 如何创建可执行文件以在特定处理器架构(而不是特定操作系统)上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1344631/

相关文章:

c - #if#endif 的作用类似于作用域吗?

c - 简单的 C 程序会被编译为 Microsoft 的中间运行时语言还是 Windows 中的机器代码

javascript - 无法将动态添加的指令编译到页面中

java - 如何在命令提示符下运行 Java 程序

c++ - Winsock 替代品(不,不是 WinPCAP)

c++ - 使用 set 对 log(N) 进行排序?

c - 函数指针和函数由于参数不兼容

c - Matlab mex 文件与其直接的 C 等效文件相比速度较慢

c++ - Viola-Jones 人脸检测方法是如何工作的?

c++ - 如何为现有类类型编写 boost 序列化包装器