Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 使用UEFI编写操作系统_Assembly_Cpu Architecture_Osdev_Efi_Uefi - Fatal编程技术网

Assembly 使用UEFI编写操作系统

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是BIOS的替代品。我想为使用EFI而不是BIOS的平台开发一个操作系统。但是我很难知道从哪里开始。谁能给我指出正确的方向吗?也许可以解释EFI对操作系统开发的意义,也许可以告诉我可以使用哪些测试环境(最好是虚拟环境)。坦率地说,我并不确定EFI到底是什么。我还应该投入时间研究手臂装配吗?我知道x86汇编,但我觉得它也已经过时了。我真的迷路了,我很想听听你的意见


谢谢

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,而且会帮助您了解特定于平台的详细信息

我是这么说的,但是上面的评论值得记住