【发布时间】:2012-12-27 22:08:32
【问题描述】:
我一直在关注"Mike OS Guide" 来制作我自己的内核,并且我得到了它的工作。但后来我查阅了互联网上的许多指南,用于在NASM 中创建一个引导扇区,从编译的C 对象加载main 函数。我已经尝试编译和链接各种 GCC 安装:
x86_64-pc-linux-
arm-uclinux-elf-
arm-agb-elf-
arm-elf-
arm-apple-darwin10-
powerpc-apple-darwin10-
i686-apple-darwin10-
i586-pc-linux-
i386-elf-
一旦我像使用MikeOS 引导程序一样将它们放到软盘上,它们都会失败。我在http://www.osdever.net/ 上尝试了各种教程,比如here 和http://wiki.osdev.org/Bare_Bones,但在Mac 上编译时没有任何效果,但我在实际的Linux 机器上还没有厌倦。但我想知道如何在组装调用C 函数时获得引导程序,并将它们放在一个工作内核文件中,然后将其加载到软盘文件上,然后加载到 ISO 上,就像MikeOS 教程中一样。还是我应该只制作kernel.bin 并用syslinux 加载它?谁能给我一个关于如何使这一切在 Mac 开发环境中工作的提示?我通过 macports 和 homebrew 收费,所以这会有所帮助。有人先后做过吗?
编辑 Here's 到目前为止我的引导区。
我只想知道如何从C 跳转到extern 函数并链接它。
【问题讨论】:
-
引导扇区开始以 16 位实模式执行。您尝试过的所有 C 编译器都编译为 32 位代码。如果您想从这些编译器运行代码输出,您的引导扇区首先必须转换到 32 位保护模式。完成此操作后,您只有 510 个字节,减去切换到保护模式所需的字节数。您可能会想要编写超出该空间容量的更多代码。
-
正确,非常正确,如果我将 BITS 32 放在开头而不是 BITS 16 会怎样
-
那么 NASM 将输出 32 位代码,CPU 会将其解释为 16 位代码,这绝对不是您想要的。
-
明白了,所以操作系统使用引导程序从 16 位到 32 或 64 位的空间,我不想要 16 位操作系统,所以我需要让引导程序传递给32位代码?而不是直接外部调用?
-
即使在您的主要是 C 内核中,您也需要处理汇编。例如,您需要程序集来加载全局描述符表。您需要编写程序集来处理中断。很多事情都需要组装,没有它就勉强勉强过活根本不是一个好主意。
标签: c macos assembly kernel nasm