【问题标题】:Writing an OS with UEFI [closed]使用 UEFI 编写操作系统 [关闭]
【发布时间】:2012-10-07 02:53:55
【问题描述】:

我最近因为上学没怎么写代码,但我决定再次开始从事操作系统开发工作。然而,最近我听说 EFI 作为 BIOS 的替代品。我想为使用 EFI 而不是 BIOS 的平台开发操作系统。我很难弄清楚从哪里开始。谁能指出我正确的方向?也许解释一下 EFI 对操作系统开发意味着什么,也许告诉我我可以使用哪些测试环境(最好是虚拟的)。坦率地说,我不太确定 EFI 到底是什么。我还应该花时间研究 ARM 组装吗?我知道 x86 Assembly,但我觉得它也已经过时了。我真的很迷茫,我很想听听你的意见。

谢谢

【问题讨论】:

    标签: assembly cpu-architecture osdev efi uefi


    【解决方案1】:

    EFI 是 UEFI 的前身,这是人们实际使用的东西,尽管他们有时仍将其称为 EFI。您可以通过uefi.org获取相关规格。

    UEFI 规范定义了 引导加载程序 可能需要了解的所有内容。 PI 规范为芯片供应商定义了接口,用于在行业中实现其代码的可移植性。因此,您会听说诸如 Win8 之类的操作系统需要符合特定版本的 UEFI 规范(例如 2.3.1c)才能使某些功能(例如安全启动)正常工作。所有这一切都表明,EFI 并没有完全取代 BIOS,而是成为 BIOS 必须遵守以支持某些操作系统的标准。

    开始的地方(在您获得规范副本后)是the TianoCore project on SourceForge。其中一个项目是OVMF,它是 UEFI 的虚拟机目标。您可能还想查看在 Windows 下运行命令提示符的 NT32 目标。当您想要设计一个位于 UEFI 接口之上的应用程序(例如引导加载程序)时,这些工具非常有用。

    就学习汇编而言,我不建议你从那里开始。要知道的东西太多了,我们创建 UEFI 的部分原因是为了让新程序员可以使用 C 而不是 ASM。在 UEFI 中有几个地方我们使用 ASM,但是构建系统会处理拼接的细节,而且您通常不需要对处理器状态进行棘手的控制,也不需要通过编写ASM。您这样做的唯一其他原因是大小,并且由于 BIOS 的其余部分将在 C 中,除非您在 ASM 中重写整个内容,否则它有点违背目的,没有人会这样做。专注于学习规范以及如何使用它们来编写您自己的 UEFI 应用程序。

    【讨论】:

      【解决方案2】:

      这个问题的答案较晚,但如果您同时没有发现以下几点,我可以补充:

      也许可以解释一下 EFI 对操作系统开发的意义

      实际上,并不多。好吧,也许有一点。好吧,让我们解释一下。 UEFI 为预引导阶段提供固件环境。它还为操作系统提供了一些运行时服务,但是,预计操作系统,而不是 UEFI 固件,最终将驱动系统 - 这些服务允许您执行各种与引导配置相关的活动 - example

      好处是,如果您准备使用符合 multiboot 2 的引导加载程序,您实际上不需要了解有关 UEFI 的任何信息 - 引导加载程序会根据多重引导规范加载您,然后调用 @987654325 @ 在 UEFI 术语中会破坏固件环境。

      可以生成具有 EFI 存根的 Linux 内核,因此可以“不”引导加载程序 - this blog shows you how。您可以为您的内核执行此操作 - 您只需要生成一个与固件位数匹配的 PE/COFF 内核。

      也许可以告诉我我可以使用哪些测试环境(最好是虚拟的)

      如果您负担得起VMWare Workstation,这将极大地帮助您。除了包含一个 gdb 存根以便您可以调试任何部分,您还可以编辑虚拟机定义文件 (*.vmx) 以包含

      firmware="efi"
      

      瞧,VMWare 将启动一个完全正常工作的 UEFI 环境。适用于 Linux 和 Windows。

      互联网上的各种帖子都提到了 QEMU 设置,当然还有 VirtualBox。我从来没有亲自在 VirtualBox EFI 平台上成功启动过任何现有系统,也没有尝试过 QEMU,尽管我相信它和其他各种模拟器可能都可以工作。

      我还应该花时间研究 ARM 组装吗?

      这取决于您的目标。关于汇编的问题,我想你应该知道它来写一个操作系统。我认为你为哪个平台编写并不重要——事实上,我认为为多个平台编写会让你更加欣赏机器之间的差异。

      不过,一般来说,我不会尝试用汇编语言编写整个操作系统。这样做的主要原因是时间——我认为这是一个爱好项目,因此为您的大量努力获得一些奖励将比尝试调试程序集(尤其是您不熟悉的程序集)更有趣。随着您变得更加熟练,您总是可以用汇编程序替换选择位,特别是当您有足够的其余代码来测试它时。

      【讨论】:

        【解决方案3】:

        您可以使用 qemu 进行一些 uefi 应用程序开发/测试。请参阅this 了解更多信息

        除此之外,我强烈建议您熟悉 uefi 并尝试在 uefi 模型中进行一些驱动程序/应用程序开发。您可以尝试从加载程序运行网络堆栈、网络启动基础设施、可能设置一个更整洁的预操作系统 GUI。这不仅能让你擅长 uefi,还能帮助你了解平台特定的细节。

        这是我的说法,但是上面的 cmets 很好记住。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-11
          • 1970-01-01
          • 2011-11-19
          • 2013-08-18
          • 2011-10-31
          • 2022-10-01
          • 2010-09-16
          • 2014-01-23
          相关资源
          最近更新 更多