【问题标题】:Execute C program at bootloader level via Assembler通过汇编程序在引导加载程序级别执行 C 程序
【发布时间】:2011-05-29 16:59:08
【问题描述】:

我在 Assembler 中编写了一个自定义(非常基本的“Hello world!”)引导加载程序,我想在其中执行一个 C 程序。 C 程序会工作,还是由于丢失stdio.h 文件而失败?以及如何将 C 程序与引导加载程序捆绑到单个 .bin 文件中以 dd 到闪存驱动器/CD?

【问题讨论】:

  • osdev wiki 提供了大量有关此类问题的信息。您可能会发现Bare bones“教程”很有趣。

标签: c assembly bootloader


【解决方案1】:

我不确定您所说的“丢失 stdio.h”是什么意思,但许多 C 运行时函数,包括在 stdio.h 中原型化的函数,都是使用系统调用实现的。如果没有操作系统运行,这些系统调用将无法工作。

可以编写在没有操作系统的情况下运行的 C 代码,例如,大多数常见的引导加载程序只有少量的汇编程序,大部分是 C 代码。诀窍是避免使用运行时库。系统调用的替代品,例如显示,是 BIOS 调用和特定于硬件的 I/O。

仅举一个例子,除了动态分配,fopen在读模式下还需要以下低级操作:

  • 从存储中读取数据块
  • 读取文件系统元数据(通常是超级块和根目录)
  • 处理文件系统元数据以找出文件内容的存储位置
  • 创建一个包含足够信息的 FILE 对象,以便 freadfgetc 在磁盘上查找数据

您没有操作系统来帮助解决这些问题,您的 C 代码将需要实现一个驱动程序(可能调用 BIOS)以进行块读取,并实现其他步骤的行为。

【讨论】:

  • 是否可以创建一个类 Unix 文件系统并至少存储 libc 及其所有文件,以及重要的 Unix 系统可执行文件,如 bash、cd、grep 以及 /bin 文件夹中的所有内容?
  • @Mohit:您可以将这些二进制文件存储在文件系统中,但它们不会工作,因为它们依赖于系统调用。 libc 非常特定于操作系统。
  • 好的。那么我将如何结合 C 和汇编程序?我知道使用“调用”,但是如何将我的 C 文件放入 .bin?
  • @Mohit:您可能想了解链接器的工作原理。还有像 elf2bin 这样的程序(通常在引导加载程序的构建系统中找到)。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 2011-01-08
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2014-10-03
  • 2015-11-28
  • 2010-12-10
相关资源
最近更新 更多