UEFI BIOS的出现绝对不是仅仅为了执行CSM --- 否则要UEFI干什么。有必要先澄清一个概念:什么是UEFI-aware OS?
UEFI-aware OS是指完全基于UEFI开发的操作系统,完全不需要legacy bios参与。操作系统使用UEFI提供的调用,彻底抛弃传统的interrupt方式的实模式调用,并且将自己的操作系统加载程序实现为UEFI应用程序的形式。
如此一个操作系统就可以被称作UEFI-aware OS了。这样的OS Loader可以利用UEFI系统的提供的诸多功能。实现更为强大的操作系统加载程序。
操作系统加载程序是什么?传统环境下就是MBR代码,这些代码一般都很短,理论上不能超过512字节。基本上用汇编写。而且要求必须小精简。不过这些限制在UEFI下统统remove。
---------------------------------------------------------------------------------------------------------------------
下面是一个假象的来自传统MBR代码的作者对于UEFI下的类似的组件 --- OS Loader的疑问与回答。
Q:MBR最多512字节,那么UEFI OS Loader呢?
A:没有限制。取决于你的实现。
Q:MBR要求存储在0磁道0扇区,那么UEFI OS Loader呢?
A:没有限制。由于UEFI内置FAT32文件系统,且规范要求必须存在GPT分区。那么只要存放在GPT分区上的/boot目录下即可。对于物理位置,由于双方概念不同,已经完全不适合再行比较了。(一个是物理概念,另一个是逻辑概念)。
Q:UEFI OS Loader都可以干什么?
A:Everything。特别的是可以调用UEFI的所有服务。包括磁盘服务,事件服务,Protocol服务等等。
Q:对于OS而言,获取内存是最重要的,我应该如何获取内存信息?
A:请忘记E820。使用gRT->GetMemoryMap调用。
Q:对于OS而言,也许我要从另一个分区上加载一些信息,可能是UEFI不支持文件系统,所以我要对C盘进行扇区级的访问,我应该用什么?
A:请使用EFI Disk I/O Protocol
Q:对于OS而言,我必须要切换到保护模式。
A:UEFI本身就是保护模式,所以无须切换。
Q:对于OS而言,我希望固件不需要的部分退出内存,不要占用我的内存空间。
A:请在启动操作系统,以及获取内存分配之前,先调用gBS->ExitBootServices。