【问题标题】:From bootsector to C++ kernel从引导扇区到 C++ 内核
【发布时间】:2011-01-13 17:46:08
【问题描述】:

我决定编写一个简单的 asm 引导加载程序和一个 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

请给我一个工作示例或告诉我如何编译。 :/ (两天前我正在浏览教程并提供帮助,但找不到正确答案)

【问题讨论】:

  • 哦我忘了写:windows

标签: c assembly compilation nasm bootloader


【解决方案1】:

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

鼻炎

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,因为那是你调用内核的地方。
  • 您从 0x1000 开始链接您的 text 部分。如果你想把你的镜像放在 MBR 中由 BIOS 加载,它应该链接在 0x7c00。
  • 附带说明:您似乎试图将引导加载程序和内核链接到一个映像中。请记住,MBR 只能容纳 512 个字节(实际上,510 个字节,因为最后 2 个字节应该包含一个神奇的值),所以您将无法在那里编写很多内核。您应该做的是创建一个单独的内核映像并从您的引导加载程序中加载它。

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

此外,您还可以通过OSDev 找到很多有用的信息。 Here 是关于编写仅使用 MBR 的实模式“内核”的教程。本教程包含工作代码。

【讨论】:

  • 贴出来的汇编代码也是32位代码。大多数 BIOS 实现将在实模式下运行引导加载程序,即 16 位代码。
猜你喜欢
  • 1970-01-01
  • 2017-05-10
  • 2016-02-15
  • 2013-07-16
  • 1970-01-01
  • 2015-06-17
  • 2013-06-01
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多