C ++中的引导加载程序

时间:2010-07-17 21:53:17

标签: c++ assembly bootloader

我通过在软盘上制作一个小型装配引导加载程序几次搞砸了,并且想知道是否可以在c ++中创建引导加载程序,如果是这样,我可以从哪里开始?据我所知,我不确定它是否会使用int main()

感谢您的帮助。

4 个答案:

答案 0 :(得分:9)

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

装配是第一阶段的唯一选择,因为您需要为运行更高级别的任何东西建立一个合理的环境。做足够的运行C代码非常简单 - 您需要:

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

然后,您可以在适当的位置(例如main())跳转到代码,并期望基本的语言功能可以正常工作。 (可能已经实现或链接的标准的任何功能可能需要在此阶段进行额外的初始化。)

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

  • 运行静态构造函数;
  • 内存分配以支持newdelete;
  • 支持运行时类型信息(RTTI);
  • 支持例外;
  • 可能是我忘记提及的其他一些事情。

在C环境启动并运行之前,这些都不是必需的,因此处理这些内容的代码可以用C而不是汇编程序(甚至是不使用上述功能的C ++子集)编写。

(相同的原则适用于嵌入式系统,这种系统使用C ++并不常见,但只是以有限的方式 - 例如没有异常和/或RTTI,因为没有实现运行时支持。)

答案 1 :(得分:3)

自从我玩编写bootloader以来已经有一段时间了,所以我要离开记忆。

对于x86引导加载程序,您需要一个可以发出x86程序集的C ++编译器,或者至少需要在16位程序集中编写自己的前导码,这样可以将CPU置于32位保护状态(或64位长)模式,然后才能调用C ++函数。

但是,一旦你完成了这个,你就应该能够利用大部分(如果不是全部)C ++的语言特性,只要你远离那些需要底层libc的东西。但是如果没有CRT,那么静态地链接一切,你就是金色的。

答案 2 :(得分:2)

Bootloader没有“int main()”,除非您编写汇编代码来调用它。 如果您正在编写第1阶段的引导加载程序,则严重不鼓励它。

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

答案 3 :(得分:2)

是的,这是可能的。您可以在this question

中找到答案和有用链接的元素

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

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

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