是否可能使用C或C ++创建引导程序,而不使用某种类型的汇编语言(最好不使用__asm)?我正在编写一个操作系统,并希望完全使用C和C ++进行编写。
是否可能使用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)在调用复位向量之前被初始化等因素。在系统早期初始化中往往存在许多"陷阱"。
准备好熟悉你的编译器、汇编器和链接器文档——生成一个可以作为第一阶段引导加载程序的平面二进制文件通常是一个非常麻烦的过程。
祝你好运!
__setReg
在x86上不起作用。如果有人编辑过后,我会点赞的。抱歉。 - user541686C
(或C ++)无法完成太多事情:您需要快速屏蔽中断,并且没有C
函数可用于此。需要使用汇编语言。这对于大多数其他体系结构也可能是相同的:C和C ++根本没有这些内置功能(一些编译器扩展可能会有所帮助)。关于你正在尝试做的事情,一个很好的资源是:OSDev。我认为答案是不可以,因为你需要像这样做才能切换到保护模式:
lgdt[GDTR]
jmp CODESEL:FLUSH
FLUSH:
...
我认为在纯C/C++中没有办法执行jmp
指令,但我可能不正确。(我绝不是专家;我只是参考了一段时间前制作的一个引导加载程序。)