C/ c++引导程序

Bootloader in C/C++?

本文关键字:引导程序 c++      更新时间:2023-10-16

是否有可能在C或c++中创建引导加载程序而不使用某种类型的汇编程序(最好不使用__asm)?我正在写一个操作系统,希望它完全是用C和c++编写的。

这非常依赖于系统。在大多数情况下,答案是否定的——在开始运行C代码之前,您需要编写一些自定义程序集来设置C运行时。然而,也有一些例外。例如,ARM Cortex-M0可以直接在复位状态下运行C代码。

假设,您没有使用M0,所以您将需要编写一些汇编。同样,它依赖于系统/芯片,但您可以使用如下简单的东西:

reset_vector:
    mov  sp, SOME_KNOWN_GOOD_STACK_ADDRESS
    call c_entry_point

,它只是初始化堆栈指针并调用C程序的入口点。当然,这个简单的设置取决于你的芯片有一个支持它的重置向量/向量表,RAM(或类似RAM的东西)在重置向量被调用之前被初始化,等等。在早期的系统初始化中往往有很多"陷阱"。

准备好对编译器、汇编器和链接器文档非常友好—生成一个可以作为第一阶段引导加载程序的平面二进制文件通常本身就是一个很大的痛苦。

祝你好运!

假设这是针对x86的,如果你有正确的编译器选项并设法获得正确的引导扇区布局,那么你可能会得到在16位模式下运行。

但是你不会得到远与纯C(或c++):你需要屏蔽中断真的很快,没有C函数。需要装配。

这对于大多数其他体系结构来说可能是一样的:C和c++根本没有内置这些特性(一些编译器扩展可能会帮助您)。

OSDev.

假设x86保护模式:

我相信答案是,因为你需要做这样的事情来切换到保护模式:

    lgdt[GDTR]
    jmp CODESEL:FLUSH
FLUSH:
    ...

我不认为有一种方法做jmp指令在纯C/c++,虽然我可能是错的。(我绝不是这方面的专家;我只是引用一个引导加载程序,我做了一段时间前)

不,这是不可能的"纯"C,至少在x86…除了x86机器将引导到16位实模式(需要编译器生成16位而不是32位代码)这一事实之外,您还需要屏蔽中断、设置段寄存器、从硬件设备(即磁盘)将代码加载到内存中、设置堆栈、访问I/O端口等能力,所有这些在x86和其他平台上都需要访问CPU的寄存器和/或特定的汇编命令。

其次,对于c++,如果你决定定义任何类,你将需要有某种类型的手动配置和运行"构造函数"来设置内存,以便你的初始类可以实际存在于内存的某个地方…您也不能抛出任何异常。从本质上讲,您将尝试使用的任何c++特定特性都是无用的,因为这些高级数据抽象需要操作系统运行时本身的适当支持,而这些支持必须使用汇编和C代码的组合来设置。