9

如何将C程序编译为有效的ELF格式(或 RAW 格式),以便可以在没有任何操作系统的情况下直接从 RAM 执行?假设存在一个引导加载程序,它能够将代码加载到 RAM 中的任何位置并在该地址开始执行。准确地说,编译器(GCC)标志应该是什么?是否需要地图文件?

一个示例 helloworld 应用程序将是最受欢迎的 :)

只是为了详细说明我的观点,
让 main() 方法是一个空的无限 while 循环,以确保不使用特定于操作系统或标准库的调用。所需的 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 并执行。

4

4 回答 4

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 所需的标志。

我打开了一个随机生成文件,发现使用了以下标志: gcc : -nostdinc -fno-builtin ld: -nostdlib
(对链接器进行了显式调用,因此 ld 也需要一个标志)。

flags 的目的是告诉 gcc 不能与标准库进行链接。

于 2009-04-03T13:46:59.293 回答
2

coreboot 可以加载独立的 ELF。请参阅“初始化 DRAM”:

http://en.wikipedia.org/wiki/Coreboot

于 2009-04-05T13:47:11.460 回答
1

http://www.osdever.net/bkerndev/index.php

这个网站一步一步地回答你的问题......

于 2009-04-07T05:42:37.940 回答
0

您是否意识到,如果您不加载操作系统,则必须编写设备驱动程序才能与任何设备一起使用。这意味着如果不为该特定视频卡编写驱动程序就不能写入屏幕,如果不为该特定硬盘驱动器控制器卡编写驱动程序就不能从磁盘读取,不能访问键盘等。

您可能想研究一种称为Kiosk 模式的东西。基本思想是操作系统运行,加载您的应用程序所需的一切,加载您的应用程序,然后您不能切换到另一个应用程序。

于 2009-04-03T15:03:32.323 回答