Operating system 在MacOSX下开发简单的操作系统,如何从Mach-O构建引导img?

Operating system 在MacOSX下开发简单的操作系统,如何从Mach-O构建引导img?,operating-system,Operating System,我正在MacOSX环境下编写一个简单的操作系统。我可以通过nasm构建一个简单的引导加载程序。当我用C语言开发更多的部分时,我应该一起构建它们。MacOSX的GCC将编译Mach-O输出格式。我想知道如何cat输出对象的指令部分,并将其与nasm部分链接在一起 谢谢。还有一个更大的问题,你没有看到 GCC不生成16位x86代码,仅生成32位或64位代码。x86 PC引导加载程序以实寻址模式开始执行,这是一种仅适用于16位代码的16位模式 因此,即使您设法将使用gcc编译的C代码和使用NASM编译

我正在MacOSX环境下编写一个简单的操作系统。我可以通过nasm构建一个简单的引导加载程序。当我用C语言开发更多的部分时,我应该一起构建它们。MacOSX的GCC将编译Mach-O输出格式。我想知道如何cat输出对象的指令部分,并将其与nasm部分链接在一起


谢谢。

还有一个更大的问题,你没有看到

GCC不生成16位x86代码,仅生成32位或64位代码。x86 PC引导加载程序以实寻址模式开始执行,这是一种仅适用于16位代码的16位模式

因此,即使您设法将使用gcc编译的C代码和使用NASM编译的汇编代码链接在一起,您也无法执行C代码部分(任何32位代码部分),直到您切换到32位保护模式,这不是一件很容易的事情

您也不想在512字节长的引导扇区中切换到保护模式。BIOS功能不能在保护模式下使用。如果切换太早,将无法从磁盘加载更多内容

最实用的策略是将引导加载程序分成几个部分。512字节长的引导扇区将使用BIOS磁盘I/O功能加载下一部分。这些其他部分要么包含整个操作系统,要么包含足够的代码,通过使用相同的BIOS I/O功能,或者在实际或受保护模式下使用自己的磁盘驱动程序,加载操作系统的其余部分

因此,你注定要用汇编语言手工为引导扇区编写16位代码,没有C,没有32位

但是,您可以使用其他能够为引导加载程序的其他部分生成16位x86代码的C编译器。至少有两个这样的编译器在网上免费提供:

    Turbo C++ 1.01(仅在DOS、Windows XP或以下运行,VDMS与DOS / Windows,如DOSBOX)
  • 打开Watcom C/C++1.9(在DOS、Windows和Linux中运行)

谢谢。我已经完成引导部分,并切换到保护模式。我可以用两个任务运行一个简单的操作系统。但是所有的代码都是nasm的汇编语言。我已切换到32位模式。问题是,我想用一些c代码链接head.s。谢谢。制作一个普通的ELF二进制文件或编译器能产生的任何东西。然后为该格式创建加载程序,或者使用其他工具(例如,
objdump
)对其进行后期处理。或者,检查链接器是否支持平面二进制输出格式。但是,尽管这看起来很简单,但实际上过于简单了,因为在某些情况下,您需要区分代码区和数据区、只读区和可写区、可执行区和不可执行区等,并且您可能希望支持可重新定位的二进制文件。所有这些都意味着二进制文件中需要包含一些关于自身的信息。谢谢。我看过一些关于elf的资料,但由于我的mac os系统,我的输出是Mach-O格式,这比elf更复杂。我想得到一些关于Mach-O的资料,把它转换成原始二进制代码。