从bootsector到C ++内核

时间:2011-01-13 17:46:08

标签: c assembly compilation nasm bootloader

我决定编写一个简单的asm bootloader和一个c ++内核。我阅读了很多教程,但是我无法编译汇编文件,如下所示:

[BITS 32]
[global start]
[extern _k_main]
start:
   call _k_main
   cli
   hlt

(我想从c文件中调用k_main函数)

编译/汇编/链接错误:

nasm -f bin -o kernelstart.asm -o kernelstart.bin:
error: bin file cannot contain external references

好的,然后我尝试创建一个.o文件:

nasm -f aout -o kernelstart.asm -o kernelstart.o  (That's right)
ld -i -e _main -Ttext 0x1000 kernel.o kernelstart.o main.o
error: File format not recognized

有人给我一个工作示例或者说如何编译。 :/ (我正在浏览教程并在2天前提供帮助,但找不到合适的答案)

1 个答案:

答案 0 :(得分:3)

我没有直接回答您的错误来自哪里。但是,我确实看到很多事情都出错了,所以我会在这里写下这些:

<强> NASM

nasm -f aout -o kernelstart.asm -o kernelstart

这甚至有用吗?这应该是

nasm -f aout -o kernelstart kernelstart.asm

<强> LD

ld -i -e _main -Ttext 0x1000 kernel.o kernelstart.o main.o

既然你说你想制作一个bootloader和一个内核,我假设你的目标是让ld输出一些可以放在MBR中的东西。如果是这种情况,请记住以下几点:

  • 您没有指定输出格式。如果要创建MBR映像,请将--oformat=binary添加到命令行选项。这样可以确保生成平面二进制文件。
  • 您将入口点设置为_main。我不确定该符号的定义位置,但我想您希望您的入口点为start,因为这就是您调用内核的位置。
  • 您从0x1000开始链接text部分。如果要将图像放入要由BIOS加载的MBR中,则应将其链接到0x7c00。
  • 作为旁注:似乎您尝试将引导加载程序和内核链接在一个映像中。请记住,MBR只能容纳512个字节(好吧,实际上510个字节,因为最后2个字节应该包含一个魔术值),所以你将无法在那里写入很多内核。您应该做的是创建一个单独的内核映像并从引导加载程序加载它。

我希望这些要点可以帮助您解决问题。

此外,您会找到许多有用的信息OSDevHere是一个关于编写仅使用MBR的实模式“内核”的教程。本教程包含工作代码。