Assembly 使用UEFI编写操作系统
由于学校的原因,我最近没怎么编写代码,但我决定再次开始操作系统开发。不过,最近我听说EFI是BIOS的替代品。我想为使用EFI而不是BIOS的平台开发一个操作系统。但是我很难知道从哪里开始。谁能给我指出正确的方向吗?也许可以解释EFI对操作系统开发的意义,也许可以告诉我可以使用哪些测试环境(最好是虚拟环境)。坦率地说,我并不确定EFI到底是什么。我还应该投入时间研究手臂装配吗?我知道x86汇编,但我觉得它也已经过时了。我真的迷路了,我很想听听你的意见Assembly 使用UEFI编写操作系统,assembly,cpu-architecture,osdev,efi,uefi,Assembly,Cpu Architecture,Osdev,Efi,Uefi,由于学校的原因,我最近没怎么编写代码,但我决定再次开始操作系统开发。不过,最近我听说EFI是BIOS的替代品。我想为使用EFI而不是BIOS的平台开发一个操作系统。但是我很难知道从哪里开始。谁能给我指出正确的方向吗?也许可以解释EFI对操作系统开发的意义,也许可以告诉我可以使用哪些测试环境(最好是虚拟环境)。坦率地说,我并不确定EFI到底是什么。我还应该投入时间研究手臂装配吗?我知道x86汇编,但我觉得它也已经过时了。我真的迷路了,我很想听听你的意见 谢谢EFI是UEFI的前身,UEFI是人们实
谢谢EFI是UEFI的前身,UEFI是人们实际使用的东西,尽管他们有时仍然称之为EFI。您可以在下一步了解相关规范 UEFI规范定义了引导加载程序可能需要知道的一切。PI规范为硅供应商定义了接口,以便于其代码在行业中的可移植性。因此,您将听到一个操作系统,如Win8,需要遵守UEFI规范的特定版本,如2.3.1c,才能使某些功能正常工作,如安全引导。所有这些都说明EFI并没有取代BIOS,而是成为BIOS必须遵守的标准,以支持某些操作系统 开始工作的地方(在您获得规范副本后)是。其中一个项目是UEFI的虚拟机目标。您可能还希望查看在windows下运行命令提示符的NT32目标。当您想要设计一个位于UEFI接口之上的应用程序(如引导加载程序)时,可以使用这些工具
至于学习组装,我不建议你从那里开始。我们要知道的事情太多了,我们创建UEFI的部分原因是为了让新的程序员可以使用C语言而不是ASM。在UEFI中有几个地方我们使用ASM,但是构建系统会处理其中的拼接细节,并且通常不需要对处理器状态进行复杂的控制,也不需要编写ASM时获得的性能。唯一的另一个原因是大小,而且由于BIOS的其余部分将使用C语言,除非您在ASM中重写整个内容,否则这有点违背了目的,因为没有人会这么做。专注于学习规范以及如何使用它们编写自己的UEFI应用程序。这个问题的答案很晚,但如果您在同一时间没有发现它们,我可以补充以下几点: 也许可以解释EFI对操作系统开发的意义 事实上,不是很多。也许有一点。好的,让我们解释一下。UEFI为预引导阶段提供固件环境。它还向操作系统提供一些运行时服务,但是,预期操作系统(而不是UEFI固件)最终将驱动系统-这些服务允许您执行各种与引导配置相关的活动 好处是,如果您准备使用符合以下条件的引导加载程序:您实际上不需要了解UEFI的任何信息-引导加载程序将根据multiboot规范加载您,然后调用
ExitBootServices()
,用UEFI的术语来说,这会破坏固件环境
可以生成一个Linux内核,它有一个EFI存根,因此在“没有”引导加载程序的情况下引导。您可以为您的内核执行此操作—您只需要生成一个与固件位匹配的PE/COFF内核
也许可以告诉我我能为我们提供什么样的测试环境(最好是虚拟的)
如果你能负担得起,这将大大帮助你。除了包含gdb存根以便可以调试任何内容的任何部分外,还可以编辑虚拟机定义文件(*.vmx)以包含
firmware="efi"
瞧,VMWare将启动一个完全工作的UEFI环境。适用于Linux和Windows
互联网上的各种帖子都提到了QEMU设置,当然还有VirtualBox。我个人从未在VirtualBox EFI平台上成功启动过任何现有系统,也没有尝试过QEMU,尽管我相信它和其他各种模拟器可能都能工作
我还应该投入时间研究手臂装配吗
这取决于你的目标。关于组装的问题,我想你应该知道如何编写操作系统。我不认为你为哪个平台写东西很重要——事实上,我认为为多个平台写东西会让你更加欣赏机器之间的差异
不过,一般来说,我不会尝试在汇编中编写整个操作系统。这样做的主要原因是时间——我认为这是一个爱好项目,因此为您的广泛努力获得一些回报将比努力调试程序集(尤其是您不熟悉的程序集)有趣得多。当你变得更加熟练时,你总是可以用汇编程序替换选择位,特别是当你有足够的代码来测试它时。你可以使用qemu来做一些uefi应用程序开发/测试。有关更多信息,请参阅 除此之外,我强烈建议您熟悉uefi,并尝试在uefi模型中进行一些驱动程序/应用程序开发。您可以尝试从加载程序运行网络堆栈、上网本基础设施,或者设置一个更整洁的操作系统前GUI。这不仅会使您擅长uefi,而且会帮助您了解特定于平台的详细信息 我是这么说的,但是上面的评论值得记住