6

我正在尝试开发一个简单的操作系统。我以前做过一些汇编程序,不得不用INT 10h它来在屏幕上显示字符。我了解 UEFI 支持旧版 BIOS,并且可能仍然可以使用INT 10h服务。但是,如果我选择构建纯 UEFI 可启动操作系统,我应该避免使用INT 10h? 还是我看事情的方式不对?

换句话说,深入printfstdout(屏幕)最终会调用 BIOSINT 10h吗?还是问题 - “SYS_WRITE函数调用是否基于 INT 10h?” 更合适?

我还需要创建一个 512 字节的引导扇区并将它们作为磁盘(或磁盘映像)上的第 0 个扇区吗?位置0x7c00还有意义吗?

4

2 回答 2

7

如果您的引导加载程序是 UEFI 引导加载程序(您将知道是否是),那么您可能根本不使用 BIOS,包括 int 0x10 - 您必须使用 UEFI 引导服务,它提供 BIOS 否则会提供给传统引导系统的所有功能。

如果您没有编写 UEFI 引导加载程序,但您的硬件启用了 UEFI,您的引导加载程序将以“传统”模式加载,您将能够像以前一样使用 BIOS。

或者换句话说,您的引导映像可以是 UEFI 引导加载程序,也可以是旧版 BIOS 映像。旧版 BIOS 映像不能使用 UEFI,UEFI 引导加载程序也不能使用 BIOS。

换句话说,深入到标准输出(屏幕)的 printf 是否最终会调用 BIOS INT 10h?还是问题 - “SYS_WRITE 函数调用是否基于 INT 10h?” 更合适?

取决于谁编写了你的​​ printf 函数(你是操作系统,你下面没有人)。如果您调用 Int 0x10 并且没有设置 IDT 来处理它作为对 UEFI 的调用以将字符写入屏幕,那么您只是在使用未定义的行为。

我还需要创建一个 512 字节的引导扇区并将它们作为磁盘(或磁盘映像)上的第 0 个扇区吗?位置 0x7c00 是否还有意义?

不,也不。UEFI 支持更大的引导加载程序,并且不会在 0x7C00 加载。如果你想知道哪些内存区域有特殊意义,你必须让 UEFI 给你一个内存映射。

于 2013-02-27T19:48:29.607 回答
3

PC BIOS 不是 UEFI 编程模型的一部分,因此您不应在 UEFI 应用程序中使用它。例如,要打印到屏幕上,您将使用 UEFI 库中的函数。

从磁盘读取第一个扇区并将其加载到 0x7C00 是 BIOS 特定的引导协议。UEFI 引导加载程序是从文件系统加载的。您可以在OSDev Wiki上阅读有关它的更多信息。

于 2013-02-27T09:55:21.457 回答