3

我决定编写一个简单的 asm 引导加载程序和一个 c++ 内核。我阅读了很多教程,但我无法编译汇编文件,看起来像这样:

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

(我想从 c 文件中调用 th 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 天前提供帮助,但找不到正确答案)

4

1 回答 1

3

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

鼻涕虫

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

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

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

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

此外,您会发现很多有用的信息作为OSDev是编写仅使用 MBR 的实模式“内核”的教程。本教程包含工作代码。

于 2011-01-14T08:55:15.827 回答