C/ c++引导程序
Bootloader in 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的东西)在重置向量被调用之前被初始化,等等。在早期的系统初始化中往往有很多"陷阱"。
准备好对编译器、汇编器和链接器文档非常友好—生成一个可以作为第一阶段引导加载程序的平面二进制文件通常本身就是一个很大的痛苦。
祝你好运!
假设这是针对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代码的组合来设置。
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- 运行加速引导程序
- 如何将项目共享"system calls"作为单例对象构建和链接到引导加载程序?
- 如何在我的引导程序exe中嵌入MSI
- 引导一个程序,该程序将选择一个特定的 Ubuntu iso 并从中引导
- QWebView正在覆盖引导程序3中的样式
- 读写FAT32引导程序映像文件在SD卡上的Win CE
- c++应用程序在windows引导下自动运行
- 自定义Arduino引导程序
- C/ c++引导程序
- 在引导过程中,在驱动程序初始化后执行操作
- .net应用程序的引导程序(预安装程序)