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实现负责为该字段提供准确的值。

相关推荐
Ai_easygo14 分钟前
多Agent协作与A2A协议——CrewAI + LangGraph搭建AI协作团队
人工智能
HIT_Weston21 分钟前
151、【Agent】【OpenCode】启动分析(CLI 命令注册)
人工智能·agent·opencode
笑小枫26 分钟前
用 Claude Code 推翻重写笑小枫网站
java·人工智能·spring boot·ai编程
audyxiao00135 分钟前
人工智能顶会AAAI 2026论文分享|SlideBot:用于生成信息丰富、可靠、多模态幻灯片的多智能体框架
人工智能·大模型·aaai·智能体·幻灯片
用户9385156350738 分钟前
Workflow 与 Agent 之争:确定性执行与智能探索的深度剖析
人工智能
阿里云大数据AI技术1 小时前
阿里云 EMR Serverless StarRocks(Stella 2.2.0) 发布:内表与湖表同时支持向量、全文与 AI Function,一条 SQL 完成多模态检索
人工智能
格林威1 小时前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
怪奇云呼军1 小时前
闪电智能Voice Agent:ASR 首字延迟和最终识别延迟怎么测?t0-t3 埋点实战
人工智能·科技·ai·语音识别
冬哥聊AI1 小时前
百万行代码里跑Claude Code?三面这题80%的人答不上来
人工智能
甄同学1 小时前
第二十三篇:Tasks系统,Claude Code如何统一管理7种后台任务
人工智能