2010-07-17 47 views
7

我在软盘上制作了一个小程序集引导装载程序,并想知道是否可以在C++中创建引导装载程序,如果有的话,我可以从哪里开始?对于我所知道的我不知道它甚至会使用int main()C++中的引导装载程序

感谢您的任何帮助。

+0

可能的重复[要在C或C++中编写自举程序?](http://stackoverflow.com/questions/1629123/to-write-a-bootloader-in-c-or-c) – sbi 2010-07-17 22:22:34

+0

我相信它们是有区别的。这个问我应该如何继续,另一个是关于C和C++之间的选择。但是有一些重叠。 – kriss 2010-07-17 22:28:39

回答

9

如果你正在编写一个引导加载程序,那么你基本上从零开始:一小段代码被加载到内存中并执行。您可以使用在C++中编写大部分引导加载程序,但您需要首先引导您自己的C++运行时环境。

组装是第一阶段的唯一选择,因为您需要为更高级别的运行设置合理的环境。做足够的C代码是非常简单的 - 你需要:

  • 代码和数据加载在正确的地方;
  • 可能有数据区的额外部分必须被零初始化;
  • 您需要将堆栈指针指向堆栈的适当内存区域。

然后,您可以在适当的位置跳转到代码(例如,main()),并期望基本语言功能将起作用。 (这是可能的,可能已经实施或挂在标准的任何功能可能在这个阶段需要额外的初始化。)

获得一个合适的环境去为C++需要更多的努力,因为在这里需要更多的初始化并且还具有需要运行时支持的核心语言功能(再次,这是在考虑库功能之前)。其中包括:

  • 运行静态构造函数;
  • 内存分配支持newdelete;
  • 支持运行时类型信息(RTTI);
  • 支持异常;
  • 可能是我忘记提及的其他一些东西。需要

没有这些,直至C环境是启动和运行,以便处理这些可以用C语言编写,而不是汇编(或甚至在C++,不利用上述的子集的代码特征)。 (同样的原理适用于嵌入式系统,这种系统使用C++并不少见,但只能以有限的方式 - 例如没有例外和/或RTTI,因为没有实现运行时支持。 )

2

引导加载程序没有“int main()”,除非您编写汇编代码来调用它。 如果你正在编写一个stage 1 bootloader,那么它会受到严重的阻碍。

否则,osdev.org有关于该主题的很好的文档。
虽然它很可能在C++中创建引导加载程序,但请记住不要将代码链接到任何动态库,并且请记住,仅仅因为它是C++,并不意味着您可以/应该使用STL等

+0

如果是C++,则可以使用STL。这是故事结尾。如果你不能使用STL,那不是C++。 – Puppy 2010-07-17 22:04:06

+0

如果它有一条尾巴它是一条狗,如果它没有它不是故事尾巴 – kriss 2010-07-17 22:07:46

+0

感谢该网站有很多很好的信息。 – nosedive25 2010-07-17 22:09:55

2

是的,这是可能的。你有答案和有用的链接元素this question

你也可以看看here,有一个C++ bootloader的例子。

需要理解的主要问题是您需要创建一个平面二进制文件而不是通常的花哨可执行文件格式(Windows上的PE或Unix上的ELF),因为这些文件格式需要一个操作系统来加载它们,并且一个启动加载器,你还没有一个操作系统。

如果静态链接(因为上述可执行问题再次出现,没有动态链接),使用库不是问题。但显然所有的OS API相关的入口点都不可用...

3

自从我开始编写自举程序,我已经有一段时间了,所以我要离开内存。

对于x86引导加载程序,您需要有一个可以发出x86程序集的C++编译器,或者至少需要在16位程序集中编写自己的前导码,以便将CPU置于32位保护(或64位长)模式,然后才能调用C++函数。然而,一旦你完成了这些工作,只要你远离需要底层libc的东西,你应该能够利用C++语言特性的大部分(如果不是全部的话)。但静态链接一切,没有CRT,你是金。