使用UEFI编写操作系统

Hud*_*den 18 assembly cpu-architecture osdev efi uefi

由于上学原因,我最近没有编码,但我决定再次开始从事OS开发工作.最近我听说EFI作为BIOS的替代品.我想为使用EFI而不是BIOS的平台开发操作系统.我无法确定从哪里开始.谁能指出我正确的方向?也许解释一下EFI对OS开发的意义,也许可以告诉我可以使用哪些测试环境(最好是虚拟的).坦率地说,我真的不确定EFI到底是什么.我也应该花时间研究ARM组装吗?我知道x86汇编,但我觉得这也已经过时了.我真的迷路了,我很想听听你的意见.

谢谢

Chi*_*ust 27

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

UEFI规范定义了引导加载程序可能需要知道的所有内容.PI规范定义了硅供应商用于在行业中实现其代码可移植性的接口.因此,您将听到一个操作系统,如Win8,要求符合特定版本的UEFI规范,如2.3.1c,以便使某些功能正常工作,如安全启动.所有这一切都说EFI不会取代BIOS,因为它成为BIOS必须遵守的标准,以支持某些操作系统.

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

至于学习集会,我不建议你从那里开始.有太多要知道,我们创建UEFI的部分原因是新程序员可以在C而不是ASM中工作.UEFI中有一些我们使用ASM的地方,但是构建系统处理拼接的细节,你通常不需要处理器状态的棘手控制或者从编写处理器时获得的性能. ASM.你要做的唯一另一个原因是尺寸,并且由于BIOS的其余部分将在C中,除非你在ASM中重写整个事情,否则它将失去目的,这是没有人会做的.专注于学习规范以及如何使用它们编写自己的UEFI应用程序.


小智 10

对这个问题的回答很晚,但如果你没有在同一时间发现它们,我可以添加以下几点:

也许解释一下EFI对OS开发的意义

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

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

有可能生成一个具有EFI存根的Linux内核,因此可以"启动"而无需启动加载程序 - 本博客将向您展示如何.您可以为内核执行此操作 - 您只需生成与固件位数匹配的PE/COFF内核.

也许告诉我我能做什么测试环境(最好是虚拟的)

如果您能负担得起VMWare工作站,这将对您有所帮助.除了包含gdb存根以便您可以调试任何部分,还可以编辑虚拟机定义文件(*.vmx)以包含

firmware="efi"
Run Code Online (Sandbox Code Playgroud)

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

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

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

这取决于你的目标.关于汇编问题,我认为你应该知道写一个操作系统.我认为你写的是哪个平台并不重要 - 实际上,我认为写多篇文章会让你更加欣赏机器之间的差异.

但是,一般情况下,我不会尝试在汇编中编写整个操作系统.这个的主要原因是时间 - 我认为这是一个业余爱好项目,因此为你的广泛努力获得一些奖励比试图调试组件尤其是你不熟悉的组件更有趣.随着您变得更加熟练,您可以随时使用汇编程序替换选择位,尤其是当您有足够的其余代码来测试它时.