2

所以我在圣诞节买了一台新电脑,它预装了 Windows 8。现在,在同一驱动器上运行 Linux Ubuntu 和 W8 时,我遇到了很多麻烦。具有单个硬盘驱动器的 2 个操作系统需要对驱动器进行分区,以便 2 个操作系统不会相互冲突。现在有一个名为Mini Partition Tool Wizard的程序在 Windows 8 中运行(还有一个类似的 Linux 程序称为 gparted),它允许您创建和调整硬盘分区的大小,只要您不覆盖您的操作系统'目前正在使用。

长话短说:我想编写自己的迷你操作系统,专门用于启动控制和硬盘管理。也就是说,一旦我将它写入、调试并编译成可执行代码,我会将它放在 USB 记忆棒上,我可以从 BIOS 菜单中启动它,然后直接设置硬盘分区,甚至在必要时格式化我的硬盘. 我很惊讶 BIOS 没有用户自己做的选项。

所以我的问题是:我可以只使用 C/C++ 的工具来做到这一点吗?还是我需要有内联汇编代码?或者也许编写一个在 C++ 程序中使用的汇编代码模块。很确定迷你分区工具向导不是开源的(Windows 也不是)。以前从来没有写过操作系统,所以我对此并不陌生,但愿意并且能够花时间学习它是如何完成的。

4

1 回答 1

1

我可以只使用 C/C++ 的工具来做到这一点吗?还是我需要有内联汇编代码?

您将需要一些程序集而不是内联类型。您编译的 C/C++ 代码需要设置和配置一些东西(例如 CPU 的 32 位保护模式、堆栈、各种 CPU 寄存器的值、设备驱动程序、中断、C/C++ 内存管理器等),而 BIOS 只是从磁盘加载一个 512 字节长的扇区并将控制权转移给它,而无需进行任何设置,而 CPU 仍处于 16 位模式。

因此,您需要编写一些汇编代码来:

  • 从磁盘加载更多内容,您不会认为所有内容都适合 512 字节,是吗?
  • 将 CPU 切换到 32 位保护模式
  • 重新配置中断控制器,使中断不会映射到与保护模式异常相同的中断向量上(嗯,这个小部分可以在 C 中完成)
  • 编写异常处理程序
  • 为定时器和键盘之类的基本东西编写中断处理程序(如果精心设计,您可能只需要在汇编中完成其中的一小部分,其余的可以在 C 中完成)

然后您需要为其他所有内容编写 32 位 I/O 设备驱动程序,因为切换后您将无法使用 BIOS。或者,您可以实现一个虚拟 8086 机器(使用虚拟 8086 模式),以便将这些东西委托给 BIOS,这也不是一件小事。其中大部分可以在 C 中完成,但仍然需要一些汇编代码的知识或使用。

您还需要重新实现 C (C++) 标准库的某些部分,因此/ malloc()newputch()getchar()等使用您的低级 API 而不是 Windows 或 Linux。fopen()time()

准备好花费几年的时间,从一无所有、缺乏知识和经验到工作。

是的,您确实可以在osdev.org开始学习。还有一些有用的新闻组:comp.lang.asm.x86alt.os.development

于 2013-02-25T19:56:19.430 回答