BIOS/UEFI基础——Console支持说明
Console简介
UEFI下的Console分为IN和OUT两类,IN的话有USB键盘输入,串口输入等,OUT的话有图像输出,串口输出等。
本文首先简单说明声明在《UEFI SPEC》中的Protocols,然后介绍其中比较重要的图像输出/串口输出相关Protocols及其实现,在此基础之上再介绍其上层的Protocols,即EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL和EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL。
下图是再《UEFI SPEC》中声明的用来支持UEFI下Console的Protocols:
其中重点介绍的是以下的几个:
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL:它是EFI_SIMPLE_TEXT_INPUT_PROTOCOL的升级版本,主要增加了按键的回调注册等功能;
EFI_SERIAL_IO_PROTOCOL:它提供了串口的输入输出功能;
EFI_GRAPHICS_OUTPUT_PROTOCOL:它提供了图像的输出功能;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL:它实际上包装了串口和图像输出的接口;
后面的内容会详细介绍上述的接口及其实现。
图像输出
本文已QEMU虚拟机为例,它模拟了一个VGA设备,如下所示:
它通过OvmfPkg\QemuVideoDxe\QemuVideoDxe.inf这个模块进行驱动。对于这个模块的具体实现这里不做介绍,重要的是在这个模块中安装了EFI_GRAPHICS_OUTPUT_PROTOCOL。
当EFI_GRAPHICS_OUTPUT_PROTOCOL安装之后,就会运行另外一个驱动:GraphicsConsoleDxe.inf。
这是一个通用的中间模块,它的作用是进行一些通用的初始化,并安装EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL,而有了个模块,才有后续的UEFI下的输出。
整个图像输出部分框架大致如下图所示:
需要注意的是,这里将的图像输出实际上最终还是按照文本的方式输出到显示器等设备上的,本文没有涉及到真正意义上的图像的输出。
串口输入/输出
串口相比图像输出要复杂一些,因为串口既可以进行输出也可以进行输入。
而且串口工具多样,涉及到不同的终端。
串口的输入输出主要分为两个部分,一个是底层串口的初始化和输入输出接口,另一部分是串口输入输出流的处理,它涉及到字符流从串口到UEFI格式的转化,最终还是会安装相应的UEFI Protocols。
下面是一图流:
输出
关于真正的输出部分其实已经在前面介绍掉了。
但是还剩下一部分就是关于如何将统一起来进行控制,即当我们调用一次输出接口就可以同时在显示器和串口上都有输出,这就依赖于额外的Protocols来做中间层。
涉及到的Protocol有如下的两个:
输入
前面已经讲到串口的输入,其它输入主要的还有键盘,这里不再多介绍。