operating-system - 在 Mac OS X 下开发 Simple OS,如何从 Mach-O 构建引导 img?

标签 operating-system

我正在写一个简单的 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/

相关文章:

python - 权限错误 : [Errno 13] Permission denied: 'emails2/Train'

c++ - 为什么 main() 的参数不是 const 限定的?

c - 尝试学习如何在受控循环中用 C 实现信号量

linux - PC引导过程一步一步

macos - Mac OS 10.6 服务器上的 $PATH 变量不断重置

parallel-processing - 在本书的上下文中,所谓的 "Fine-Grained Parallelism"究竟意味着什么?

linux - 从中断返回时必须使用 IRET 吗?

c - 没有 FPU 的处理器中的浮点计算

c - 从磁盘/CD/USB 启动

c - 如何为数据采集硬件实现 Linux 设备驱动程序?