我正在写一个简单的 Mac OS X 环境下的操作系统。我可以通过 nasm 构建一个简单的引导加载程序。当我用 C 语言开发更多的部分时,我应该将它们构建在一起。 Mac OS X 的 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 或更低版本、带有 DOS/Windows 的虚拟机中运行,例如 DosBox)
- 打开 Watcom C/C++ 1.9(在 DOS、Windows 和可能的 Linux 中运行)
关于operating-system - 在 Mac OS X 下开发 Simple OS,如何从 Mach-O 构建引导 img?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984907/