我正在尝试开发一个简单的操作系统。我以前做过一些汇编程序,必须使用INT 10h
在屏幕上显示字符。我知道UEFI支持传统BIOS,并且仍然可以使用INT 10h
服务。但是,如果我选择构建纯UEFI可引导操作系统,我应该避免使用INT 10h
吗?或者我是以错误的方式看事情的?
换句话说,向下钻取printf
到stdout
(屏幕)最终会调用BIOS INT 10h
吗?或者问题是“基于INT 10h的SYS_WRITE
函数调用吗?”更合适吗?
我是否还需要创建一个512字节的引导扇区并将它们作为第0扇区放在磁盘(或磁盘映像)上?位置0x7c00
是否具有重要性?
答案 0 :(得分:6)
如果您的引导加载程序是UEFI引导加载程序(您将知道它是否是),那么您可能根本不使用BIOS,包括int 0x10 - 您必须使用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为您提供内存映射。
答案 1 :(得分:1)
PC BIOS不是UEFI编程模型的一部分,因此不应在UEFI应用程序中使用它。例如,要打印到屏幕,您将使用UEFI库中的函数。
从磁盘读取第一个扇区并将其加载到0x7C00是BIOS特定的引导协议。 UEFI引导加载程序从文件系统加载。您可以在OSDev Wiki上了解更多相关信息。