当前位置:  开发笔记 > 运维 > 正文

没有操作系统的执行

如何解决《没有操作系统的执行》经验,为你挑选了1个好方法。

如何将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并执行.



1> 小智..:

首先,一旦bootloader完成其工作,你可以做什么就有限制.这些限制是由于以下原因:(假设您的引导加载程序(例如: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必须没有与标准库完成链接.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有