C/C++中的Bootloader?

Jos*_*ega 20 c c++ operating-system bootloader

是否可以在不使用某种类型的Assembler的情况下使用C或C++创建引导加载程序(最好不使用__asm)?我正在编写一个操作系统,并希望它完全用C和C++编写.

Car*_*rum 21

这是相当依赖系统的.在大多数情况下,答案是否定的 - 在开始运行C代码之前,您需要编写一些自定义程序集来设置C运行时.但是,有一些例外.所述的ARM Cortex-M0,例如,可以直接退出复位运行C代码.

但是,据推测,你没有使用M0,所以你需要编写一些程序集.同样,它依赖于系统/芯片,但您可以通过以下简单的方式逃脱:

reset_vector:
    mov  sp, SOME_KNOWN_GOOD_STACK_ADDRESS
    call c_entry_point
Run Code Online (Sandbox Code Playgroud)

它只是初始化堆栈指针并调用C程序的入口点.当然,这个简单的设置取决于你的芯片有一个支持它的复位向量/向量表,RAM(或类似RAM)在复位向量被调用之前被初始化,依此类推.早期的系统初始化往往会有很多"问题".

准备好对编译器,汇编器和链接器文档非常友好 - 生成一个平面二进制文件,你可以作为第一阶段引导程序闪存,这本身就是一个很大的痛苦.

祝好运!

  • @Mehrdad,但那不是标准的C. 如果你有特殊的编译器功能可以让你假装它,那就是另一回事了.我支持我的回答. (2认同)

Mat*_*Mat 6

假设这是针对x86的,如果你有正确的编译器选项并且设法通过正确的链接器魔术来设置你的bootsector的布局是正确的,你可能会得到一些在16位模式下运行的东西.

但是你不会对普通C(或C++)有所了解:你需要真正快速地屏蔽中断,而且没有任何C功能.装配是必需的.

对于大多数其他架构而言,这可能是相同的:C和C++根本就没有内置的功能(虽然某些编译器扩展可能对您有所帮助).

您正在尝试做的一个很好的资源:OSDev.


Meh*_*dad 3

假设 x86 保护模式:

我相信答案是否定的,因为您需要执行以下操作才能切换到保护模式:

    lgdt[GDTR]
    jmp CODESEL:FLUSH
FLUSH:
    ...
Run Code Online (Sandbox Code Playgroud)

我认为没有办法用jmp纯 C/C++ 来执行指令,尽管我可能是错的。(我绝不是这里的专家;我只是参考我不久前制作的引导加载程序。)

  • @Mat:我不知道......这是因为当我听到蹄声时,我想到的是马,而不是斑马。... **高中一年级**?*印象深刻* (3认同)