【问题标题】:How to write a custom kernel on mac?如何在mac上编写自定义内核?
【发布时间】: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/ 上尝试了各种教程,比如herehttp://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


【解决方案1】:

这有一些问题。首先,您提到的所有编译器都输出 32 位或 64 位代码。这很好,但是当引导扇区启动时,它以 16 位实模式运行。如果您希望能够运行该 32 位或 64 位代码,您需要首先切换到适当的模式(32 位保护模式适用于 32 位,长模式适用于 64 位)。

然后,一旦你切换到合适的模式,你甚至没有那么多的代码空间:引导扇区是 512 字节;两个字节是为可引导签名保留的,您需要一些字节用于切换到适当模式的代码。如果您希望能够使用该磁盘或 FAT 文件系统上的分区,请带走更多可用字节。除了最琐碎的程序之外,您根本没有足够的空间来运行所有程序。

那么真正的操作系统是如何处理这个问题的呢?真正的操作系统倾向于使用引导扇区从磁盘加载更大的引导加载程序。然后那个更大的引导加载程序可以加载实际的内核并切换到适当的模式(尽管这可能是加载的内核的责任——这取决于)。

编写引导加载程序可能需要大量工作,因此您可能希望使用 GRUB 并让您的内核符合 Multiboot 标准,而不是自己编写引导加载程序。 GRUB 是一个引导加载程序,它能够从磁盘加载内核(可能是 ELF 格式)并以 32 位保护模式跳转到入口点。有帮助,对吧?

这并不能让你免于学习汇编,但是:内核的入口点必须是汇编。通常,它所做的只是设置一个小堆栈并将适当的寄存器传递给具有正确调用约定的 C 函数。

你可能认为你可以直接复制而不是自己编写,你是对的,但它并没有就此结束。您还需要(至少)组装:

  • 正在加载新的全局描述符表。
  • 处理中断。
  • 使用非内存映射 I/O 端口。

...等等,更何况如果你必须调试,你可能没有一个好的调试器;相反,您必须查看反汇编、寄存器值和内存转储。即使您的代码是从 C 编译的,您也必须知道底层程序集的作用,否则您将无法调试它。

总而言之,您的主要问题是不了解汇编。如前所述,汇编对于操作系统开发至关重要。一旦你彻底了解了汇编,那么你就可以开始编写操作系统了。

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2017-07-26
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多