【发布时间】:2019-01-27 02:48:57
【问题描述】:
我制作了一个非常简单的 1 阶段引导加载程序,它主要做两件事:它从 16 位实模式切换到 64 位长模式,并从硬盘读取接下来的几个扇区,用于启动基本内核。
对于基本内核,我正在尝试用 C 语言而不是汇编语言编写代码,对此我有一些疑问:
- 我应该如何编译和链接nasm文件和C文件?
- 在编译文件时,我应该编译成 16 位还是 64 位?因为我正在从 16 位切换到 64 位。
- 如何将更多来自 C 或程序集的文件添加到项目中?
我重写了问题以使我的目标更明确,所以如果需要源代码,请告诉我添加它。
【问题讨论】:
-
由于我无法编写答案,您可以查看我为您编写的链接器脚本。我也将 stage2 与引导扇区分开(尽管它确实可以在 bootSector.asm 中删除)。有一个 build.sh 文件来展示它是如何组合在一起的,也许它会给你一些想法。这个评论部分不够我详细说明。我还将 FREE_SPACE 放置在引导加载程序下方的 0x1000 处,并且不妨碍内核。修复了一个错误,将 jnc $+3 替换为标签。要加载的扇区由链接器计算。 capp-sysware.com/misc/stackoverflow/51939790
-
还应该指出您正在尝试做的事情(将所有文件链接在一起并具有组合的引导加载程序和内核)需要链接描述文件。如果您愿意将不同的部分分开并将它们分别放在磁盘上,您可以在没有链接描述文件的情况下做到这一点,但是很难共享符号。
-
我已经从聊天中复制了这些 cmets,因为他们已经回答了 OPs 的问题并且他们得到了它的工作。不幸的是问题仍然关闭,我无法提供实际答案。
标签: gcc x86 nasm ld bootloader