【发布时间】:2012-10-29 04:49:50
【问题描述】:
互联网上似乎有很多关于编写以下 3 个引导加载程序的相同信息:
- 无限循环
jmp $ - 打印单个字符
- 打印“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