如何在mac上编写自定义内核?

时间:2013-01-14 01:06:10

标签: c macos assembly kernel nasm

我一直在关注"Mike OS Guide"制作我自己的内核,并让它运行起来。但后来我在互联网上找到了许多指南,用于在NASM中创建一个引导扇区,它从已编译的main对象加载C函数。我尝试编译和链接各种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函数并将它们组合到一个正常工作的内核文件中,然后将其加载到软盘文件上,然后加载到MikeOS中的ISO上教程。或者我应该只使用kernel.bin并使用syslinux加载它?任何人都可以给我一个关于如何在Mac开发环境中完成所有工作的技巧吗?我通过macports和自制软件收费,这样有帮助。有人先后做过这个吗?

修改 到目前为止Here's我的bootsector。

我只想知道如何从extern跳转到C函数并将其链接起来。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

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

...等等,更不用说如果你需要调试,你可能没有一个好的调试器;相反,您将不得不查看反汇编,寄存器值和内存转储。即使您的代码是从C编译的,您也必须知道底层程序集的功能,否则您将无法对其进行调试。

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