4

我一直在按照“Mike OS 指南”制作我自己的内核,并且我得到了它的工作。但后来我查阅了互联网上的许多指南,用于制作从编译对象NASM加载函数的引导扇区。我尝试编译和链接各种 GCC 安装:mainC

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/上尝试过各种教程,就像这里的教程一样,我也尝试过http://wiki.osdev.org/Bare_Bones,但是在 Mac 上编译时没有任何效果,但是我还没有厌倦真正的 Linux 机器。但我想知道如何在组装调用C函数时获得引导程序,并将它们放在一个工作内核文件中,然后将其加载到软盘文件上,然后像MikeOS教程中一样加载到 ISO 上。或者我应该只制作kernel.bin并加载它syslinux? 谁能给我一个关于如何使这一切在 Mac 开发环境中工作的提示?我通过 macports 和 homebrew 收费,所以这会有所帮助。有人先后做过吗?

编辑 到目前为止,这是我的引导区。

我只想知道如何从 跳转到一个extern函数C并链接它。

4

1 回答 1

2

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

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

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

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

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

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

  • 加载一个新的全局描述符表。
  • 处理中断。
  • Using non-memory-mapped I/O ports.

…and so on, not to mention that if you have to debug, you may not have a nice debugger; instead, you'll have to look at disassemblies, register values, and memory dumps. Even if your code is compiled from C, you'll have to know what the underlying assembly does or you won't be able to debug it.

In summary, your main problem is not knowing assembly. As stated before, assembly is essential for operating system development. Once you know assembly thoroughly, then you may be able to start writing an operating system.

于 2013-01-15T02:11:18.567 回答