通过Assembler在引导加载程序级别执行C程序

时间:2011-05-29 16:59:08

标签: c assembly bootloader

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

1 个答案:

答案 0 :(得分:7)

我不确定“lost stdio.h”是什么意思,但许多C运行时函数(包括stdio.h中的原型函数)都是使用系统调用实现的。如果没有运行OS,那些系统调用将无法正常工作。

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

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

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

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