【问题标题】:Call 32-bit or 64-bit program from bootloader从引导加载程序调用 32 位或 64 位程序
【发布时间】:2012-10-29 04:49:50
【问题描述】:

互联网上似乎有很多关于编写以下 3 个引导加载程序的相同信息:

  1. 无限循环jmp $
  2. 打印单个字符
  3. 打印“Hello World”。

这太棒了,我已经轻松完成了这 3 个变体。

我想用 C 语言编写一些 32 位或 64 位代码并对其进行编译,然后从引导加载程序中调用该代码...基本上是一个引导加载程序,例如,将计算机设置为运行一些简单的数字模拟。例如,我将从列出素数开始,然后可能是用户的一些输入/输出,以计算傅里叶变换。我不知道。

我还没有找到任何关于如何执行此操作的信息,但我什至在开始之前就已经预见到了一些问题。

首先,根据目标,编译一个C 程序会将它编译成几个不同的文件之一。对于 Windows,它是一个 PE 文件。对于 Linux,它是一个 .out 文件。这些文件都完全不同。在我的例子中,目标不是 Windows 或 Linux,它只是我在引导加载程序中编写的任何内容。

其次,实际代码存放在哪里?引导加载程序正好是 512 字节,但我用 C 编写的程序肯定会编译成更大的东西。它需要放在我的(虚拟)硬盘上,可能在某种文件系统中(我什至还没有定义!),我需要在考虑执行之前将此文件中的信息加载到内存中它。但据我了解,这一切都比 12 行“Hello World”引导加载程序复杂很多很多数量级。

所以我的问题是:如何从我的 16 位引导加载程序调用大型 32 位或 64 位程序(用 C/C++ 编写)。

【问题讨论】:

  • 我建议查看 wiki.osdev.org 。您可以使用 BIOS 到load more data from disk,然后您需要进入protected mode,或long mode 为 64 位。然后你可以解析一个可执行文件,或者只是创建一个平面二进制文件(gcc/ld 可以做到这一点),你可以直接跳转到。

标签: c assembly bootloader


【解决方案1】:

这是一个很大的话题。

你应该从学习输入和认识protected mode开始。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多