如何将 C 程序编译为有效的 ELF 格式(或RAW格式),以便可以直接从RAM执行,而无需任何操作系统?假设存在引导程序,它能够将代码加载到RAM中的任何位置并开始在该地址执行。 确切地说,编译器( GCC )标志应该是什么?是否需要地图文件?
欢迎使用示例helloworld应用程序:)
只是详细说明我的观点,
让main()方法为空无限while循环,以确保不使用 OS 特定或标准库调用。期望的o / p是一个悬念。使用通常的 GCC 选项,引导加载程序肯定无法加载可执行文件,因为它是无效的 ELF 格式。但是,通过将 -dN 选项传递给链接器,将使其成为有效的 ELF 。需要更多编译器/链接器选项才能使其挂起而不会崩溃!那些编译器选项究竟是什么?
file.c:
int main()
{
while(1);
}
编译
gcc -c -nostdinc -fno-builtin file.c
ld -dN -nostdlib file.o
Bootloader将 a.out 加载到RAM并执行。
答案 0 :(得分:6)
首先,一旦引导加载程序完成其工作,您可以执行的操作就会受到限制。 这些限制是由于以下原因: (假设您的引导加载程序(例如:grub),将您带到32位保护模式) 1.没有启用分页。你需要启用它。 2.在那里你不能与设备交互,因为你必须为IRQ设置处理程序。
这是我用来学习裸机编程艺术的经典链接(http://geezer.osdevbrasil.net/osd/index.htm)。 此外,页面上还有一个下载链接(http://geezer.osdevbrasil.net/osd/code/osd.tgz)。 tar文件包含复杂程度越来越高的演示内核。 此外,您可以查看make文件(linux.mak),并获取gcc所需的标志。
我打开了一个随机的make文件,发现使用了以下标志:
gcc:-nostdinc -fno-builtin
ld:-nostdlib
(显式调用链接器,因此ld也需要一个标志)。
标志的目的是告诉gcc必须没有与标准库完成链接。
答案 1 :(得分:2)
coreboot可以加载独立的ELF。 请参阅“初始化DRAM”:
答案 2 :(得分:1)
http://www.osdever.net/bkerndev/index.php
此网站一步一步回答您的问题......
答案 3 :(得分:0)
您是否意识到如果您不加载操作系统,则必须编写设备驱动程序以使用任何设备。这意味着没有为该特定视频卡编写驱动程序而没有写入屏幕,没有为该特定硬盘驱动器控制器卡编写驱动程序而无法从磁盘读取,无法访问键盘等。
您可能希望查看名为Kiosk Mode的内容。基本的想法是操作系统运行,加载您的应用程序所需的一切,加载您的应用程序,然后您无法切换到另一个应用程序。