欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > UEFI Spec 学习笔记---12 - Protocols —CONSOLE SUPPORT(一)

UEFI Spec 学习笔记---12 - Protocols —CONSOLE SUPPORT(一)

2025/4/18 19:45:20 来源:https://blog.csdn.net/JUSTIN_TYL/article/details/147309236  浏览:    关键词:UEFI Spec 学习笔记---12 - Protocols —CONSOLE SUPPORT(一)

12.1 Console I/O Protocol

12.9 Graphics Output Protocol

Graphics Output Protocol 主要是用于取代传统的 VGA 硬件以及对应的 VBIOS,GOP 是一个软件抽象,支持任何可预见的图形设备而不需要 VGA(Video Graphic Array) 硬件,硬件包括 VGA 显卡 以及 VGA Port,但同时也使适配当前的 VGA 硬件。

VGA 硬件以及 VBIOS 是针对于特定的硬件来执行初始化的,相比于 GOP 缺乏灵活性。

GOP 在目前固件功能的 Pre Boot 空间中非常重要,主要用于实现 Logo 显示,初始化输出的语言以及配置屏幕属性。

GOP 也是需要作为操作系统的一部分,因为在现代操作系统加载高性能 OS 显示驱动前,需要 GOP 来进行显示初始化等。GOP 为操作系统提供访问硬件 Frame Buffer 的接口以及显示输出设备的信息。

GOP driver 提供三个成员函数至此在 Pre Boot 阶段有限的需求:

  1. 初始化 frame buffer
  2. 获取当前的 video 模式
  3. 设置显示模式

GOP 需要包含足够信息用于系统启动软件直接访问线性 Frame Buffer.一个 GOP driver 需要代表一个 Frame Buffer 并且可能被一个或者多个 video 输出设备使用。

12.9.1 Blt Buffer

Block Transfer 允许数据直接被读取或者写入到 video 适配器的 video 内存.Blt 操作通过引入软件 Blt buffer 的概念来抽象 video 适配器概念。帧缓冲区将视频显示抽象为像素数组。视频显示器上的每个像素位置由其X和Y坐标定义。X坐标表示扫描线。扫描线是显示器上像素的水平线。Y坐标表示显示器上的垂直线。视频显示屏的左上角定义为(0,0),其中(X, Y)表示像素的X和Y坐标。视频显示器的右下角用(Width -1, Height -1)表示。

软件Blt缓冲区的结构是一个像素数组。像素(0,0)是软件Blt缓冲区的第一个元素。Blt缓冲区可以被认为是一组扫描线。可以使用以下算法将视频显示器上的像素位置转换为Blt缓冲区:Blt缓冲区数组索引= Y * Width + X。

每个软件Blt缓冲区条目表示一个由32位数量组成的像素。Blt缓冲像素的颜色组件采用PixelBlueGreenRedReserved8BitPerColor格式,定义为

EFI_GRAPHICS_OUTPUT_BLT_PIXEL。红色、绿色和蓝色组件的字节值表示颜色强度。这个颜色强度值的范围从最小强度0到最大强度255。

12.9.2 EFI_GRAPHICS_OUTPUT_PROTOCOL

提供一个基本抽象来设置视频模式和从 graphic controller 的 frame buffer 中复制像素。硬件 frame buffer 的线性地址也被公开,这样软件就可以直接写入视频硬件。

typedef struct EFI_GRAPHICS_OUTPUT_PROTCOL {EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE QueryMode;EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE SetMode;EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT Blt;EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;
} EFI_GRAPHICS_OUTPUT_PROTOCOL;

QueryMode:返回 graphic 设备以及 active video 输出设备支持的模式信息。

SetMode:设置 Video 的模式,并清除屏幕上的显示,也就是变成全黑色。

Blt:往 video 设备的 frame buffer 上绘制的函数抽象。

Mode:指向EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE 数据的指针。

其他的相关定义:

typedef struct {
UINT32 RedMask;
UINT32 GreenMask;
UINT32 BlueMask;
UINT32 ReservedMask;
} EFI_PIXEL_BITMASK;

位掩码,主要是用于表示相应颜色的深浅分量,比如在 32 bit pixel 中 0xFF000000 表示最深的纯红色,每个颜色掩码之间没有重叠,比如 0xFF000000 表示红色,0x00FF0000 表示绿色,0x0000FF00 表示蓝色。

typedef enum {
PixelRedGreenBlueReserved8BitPerColor,
PixelBlueGreenRedReserved8BitPerColor,
PixelBitMask,
PixelBltOnly,
PixelFormatMax
} EFI_GRAPHICS_PIXEL_FORMAT;

PixelRedGreenBlueReserved8BitPerColor:一个像素是32位,字节0代表红色,字节1代表绿色,字节2代表蓝色,字节3是保留的。这是物理帧缓冲区的定义。红色、绿色和蓝色组件的字节值表示颜色强度。这个颜色强度值的范围从最小强度0到最大强度255。

PixelBlueGreenRedReserved8BitPerColor:同上,只是颜色位置变化。

PixelBitMask:物理帧缓冲区的像素定义由EFI_PIXEL_BITMASK定义。

PixelBltOnly:该模式不支持物理帧缓冲区。

PixelFormatMax::有效的EFI_GRAPHICS_PIXEL_FORMAT enum值小于此值

typedef struct {
UINT32 Version;
UINT32 HorizontalResolution;
UINT32 VerticalResolution;
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
EFI_PIXEL_BITMASK PixelInformation;
UINT32 PixelsPerScanLine;
} EFI_GRAPHICS_OUTPUT_MODE_INFORMATION;

Version:数据结构的版本

HorizontalResolution:屏幕的水平分辨率

VerticalResolution:屏幕的垂直分辨率

PixelFormat:定义像素的物理格式的枚举。PixelBltOnly的值意味着线性帧缓冲区不可用于此模。

PixelInformation:这个位掩码只有在PixelFormat设置为PixelPixelBitMask时才有效。被设置的位定义了哪些位用于哪些目的,如红、绿、蓝或保留.

PixelsPerScanLine:定义每个显存行像素元素的数量。出于性能原因,或者由于硬件限制,扫描线可能会被填充到一定的内存对齐量。这些填充像素元素位于HorizontalResolution覆盖的区域之外,不可见。对于直接的帧缓冲区访问,这个数字被用作视频存储器中像素线开始之间的跨度。基于单个像素元素和PixelsPerScanline的大小,视频内存中从像素元素(x, y)到像素元素(x, y+1)的偏移量必须计算为“sizeof(PixelElement) * PixelsPerScanline”,而不是“sizeof(PixelElement)”

* HorizontalResolution”,尽管在许多情况下这些值可以重合。此值可能取决于视频硬件和模式分辨率。GOP实现负责为该字段提供准确的值。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词