Operating system 在EFI模式下引导是否意味着我将无法访问BIOS中断?

Operating system 在EFI模式下引导是否意味着我将无法访问BIOS中断?,operating-system,boot,bios,osdev,efi,Operating System,Boot,Bios,Osdev,Efi,我正在尝试开发一个简单的操作系统。我以前做过一些汇编程序,不得不使用int10h在屏幕上显示字符。我知道UEFI支持传统BIOS,并且可能仍然能够使用int10h服务。然而,如果我选择构建一个纯UEFI可引导操作系统,我应该避免使用int10h?还是我看事情的方式不对 换句话说,向下钻取的printf到stdout(屏幕)是否最终调用BIOSint10h?还是“基于INT 10h的SYS\u WRITE函数调用”更合适 我仍然需要创建一个512字节的引导扇区,并将它们作为磁盘(或磁盘映像)上的第

我正在尝试开发一个简单的操作系统。我以前做过一些汇编程序,不得不使用
int10h
在屏幕上显示字符。我知道UEFI支持传统BIOS,并且可能仍然能够使用
int10h
服务。然而,如果我选择构建一个纯UEFI可引导操作系统,我应该避免使用
int10h
?还是我看事情的方式不对

换句话说,向下钻取的
printf
stdout
(屏幕)是否最终调用BIOS
int10h
?还是“基于INT 10h的
SYS\u WRITE
函数调用”更合适


我仍然需要创建一个512字节的引导扇区,并将它们作为磁盘(或磁盘映像)上的第0个扇区吗?位置
0x7c00
是否还有意义?

PC BIOS不是UEFI编程模型的一部分,因此您不应该在UEFI应用程序中使用它。例如,要在屏幕上打印,可以使用UEFI库中的函数


从磁盘读取第一个扇区并将其加载到0x7C00是一种特定于BIOS的引导协议。UEFI引导加载程序是从文件系统加载的。您可以在上阅读有关它的更多信息。

如果您的引导加载程序是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给你一个内存映射。

那么这是否意味着我不应该在我的引导加载程序中使用
INT 10h
?还是我的操作系统?我的操作系统是否必须使用UEFI库中的函数?如果我收集的东西正确,在
exitBootServices()
之后,我不能使用UEFI函数。您确实不会从UEFI引导加载程序中使用
INT 10h
。您可以在操作系统中使用
int10h
,但您很可能希望编写一个直接写入视频缓冲区的屏幕驱动程序。@LordLoh。在exitBootServices()之后,就不能再使用引导服务了。还有一些UEFI服务(称为UEFI运行时服务)您仍然可以调用,例如,即使在调用exitBootServices之后也可以更改屏幕分辨率。嗯,至少在您别无选择之前,请同时关闭BIOS和UEFI。如果它是您想要的文本,您所要做的就是将其置于线性0xB8000(也称为实模式0xB800x0x0000)并以两个字节(一个ascii一种颜色)成对打印。