【问题标题】:Does booting in EFI mode mean that I shall not have access to BIOS interrupts?以 EFI 模式启动是否意味着我将无法访问 BIOS 中断?
【发布时间】:2013-02-12 14:47:21
【问题描述】:

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

换句话说,向下钻取printfstdout(屏幕)是否最终调用了BIOS INT 10h?还是问题 - “SYS_WRITE 函数调用是否基于 INT 10h?”更合适?

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

【问题讨论】:

  • 嗯,把 BIOS 和 UEFI 都搞砸了,至少在你别无选择之前。如果它是你想要的文本,你所要做的就是把它放在线性 0xB8000 又名实模式 0xB800x0x0000 并以 2 字节对打印,一个 ascii 一种颜色。

标签: operating-system boot bios osdev efi


【解决方案1】:

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

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

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

换句话说,向下钻取 printf 到 stdout(屏幕)是否最终调用 BIOS INT 10h?或者是问题 - “SYS_WRITE 函数调用是否基于 INT 10h?”更合适?

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是否意味着我不应该在我的引导加载程序中使用INT 10h?还是我的操作系统?我的操作系统是否必须使用 UEFI 库中的函数?如果我收集的东西正确,在exitBootServices() 之后,我无法使用 UEFI 功能。
    • 您确实不会使用 UEFI 引导加载程序中的 INT 10h。您可以在您的操作系统中使用INT 10h,但您很可能希望编写一个直接写入视频缓冲区的屏幕驱动程序。
    • @LordLoh。在 exitBootServices() 之后,您不能再使用引导服务。有一些 UEFI 服务(称为 UEFI 运行时服务)您仍然可以调用,例如在调用 exitBootServices 之后更改屏幕分辨率。
    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2023-03-13
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多