【问题标题】:Execution without OS无操作系统执行
【发布时间】:2010-10-17 08:34:11
【问题描述】:

如何将 C 程序编译成有效的 ELF 格式(或 RAW 格式),以便它可以直接从 RAM 执行而无需任何 OS ?假设存在一个 bootloader,它能够将代码加载到 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 文件.o

Bootloader 将 a.out 加载到 RAM 并执行。

【问题讨论】:

    标签: c linux boot bootstrapping bare-metal


    【解决方案1】:

    首先,一旦引导加载程序完成工作,您可以执行的操作会受到限制。 这些限制是由于以下原因: (假设您的引导加载程序(例如: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 也需要一个标志)。

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

    【讨论】:

    • 谢谢...这些链接非常有用:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      本网站逐步回答您的问题...

      【讨论】:

        【解决方案4】:

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

        您可能想查看名为 Kiosk Mode 的内容。基本思想是操作系统运行,加载您的应用所需的一切,加载您的应用,然后您无法切换到另一个应用。

        【讨论】:

        • 无需编写设备驱动程序,您可以只停留在实模式并使用 BIOS 中断来访问所有这些东西。否则,视频 (VESA)、键盘(PS/2 仿真)等都非常标准化。
        • 首先我试图在系统上创建一个挂起(参见问题中的代码)。为了产生挂起,您不需要任何驱动程序(我认为引导加载程序将提供的内存驱动程序除外)。但我遇到了崩溃。完成此操作后,我可以获取驱动程序代码并进一步探索...
        猜你喜欢
        • 2011-07-17
        • 1970-01-01
        • 2019-05-13
        • 1970-01-01
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        相关资源
        最近更新 更多