UEFI原理与编程实践--EFI System Table中的输入输出

2024-06-07 05:18

本文主要是介绍UEFI原理与编程实践--EFI System Table中的输入输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一节UEFI原理与编程的书籍里面貌似没有提到,不过在我上次使用飞腾源代码增加功能的过程中发现logo界面的左上角有个光标,后来发现源代码也有,这就让有强迫症的人非常不爽啦,这个光标怎么来的呢,我找了几个地方,都不对,后来懒得找了,既然在logo出现前就有这个光标了,那我直接在logo显示前清屏不就ok了么,然后把这个问题顺利解决。

输入输出在UEFI中使用非常广泛,随便举个栗子,大家经常使用的Print打印输出在屏幕上:

UINTN
InternalPrint (IN  CONST CHAR16                     *Format,IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Console,IN  VA_LIST                          Marker)
{EFI_STATUS  Status;UINTN       Return;CHAR16      *Buffer;UINTN       BufferSize;ASSERT (Format != NULL);ASSERT (((UINTN) Format & BIT0) == 0);ASSERT (Console != NULL);BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);Buffer = (CHAR16 *) AllocatePool(BufferSize);ASSERT (Buffer != NULL);Return = UnicodeVSPrint (Buffer, BufferSize, Format, Marker);if (Console != NULL && Return > 0) {//// To be extra safe make sure Console has been initialized//Status = Console->OutputString (Console, Buffer);if (EFI_ERROR (Status)) {Return = 0;}}FreePool (Buffer);return Return;
}UINTN
EFIAPI
Print (IN CONST CHAR16  *Format,...)
{VA_LIST Marker;UINTN   Return;VA_START (Marker, Format);Return = InternalPrint (Format, gST->ConOut, Marker);VA_END (Marker);return Return;
}

使用的就是EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL中的OutputString,那么我们来看下这个EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL里面都有什么:

struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {EFI_TEXT_RESET                Reset;EFI_TEXT_STRING               OutputString;EFI_TEXT_TEST_STRING          TestString;EFI_TEXT_QUERY_MODE           QueryMode;EFI_TEXT_SET_MODE             SetMode;EFI_TEXT_SET_ATTRIBUTE        SetAttribute;EFI_TEXT_CLEAR_SCREEN         ClearScreen;EFI_TEXT_SET_CURSOR_POSITION  SetCursorPosition;EFI_TEXT_ENABLE_CURSOR        EnableCursor;////// Pointer to SIMPLE_TEXT_OUTPUT_MODE data.///EFI_SIMPLE_TEXT_OUTPUT_MODE   *Mode;
};

既然输入输出,有OUTPUT,那么肯定有INPUT:

struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL {EFI_INPUT_RESET     Reset;EFI_INPUT_READ_KEY  ReadKeyStroke;////// Event to use with WaitForEvent() to wait for a key to be available///EFI_EVENT           WaitForKey;
};

具体使用:

Reset:重新输出

gST->ConOut->Reset (gST->ConOut, FALSE);//有清屏作用?

OutputString:输出到显示屏幕

gST->ConOut->OutputString (gST->ConOut, L"XXXXXXXXX \n");

QueryMode:查询输出模式,和图像查询类似,但没那么多功能 ,Rows为行, Columns为列,所以这个查询很明显,就是查询当前输出位置在哪。 

 UINTN                                GetCol,GetRow;gST->ConOut->QueryMode (gST->ConOut,gST->ConOut->Mode->Mode,&GetCol,&GetRow);

 SetMode:设置输出模式

UINTN   LoopVar;
Status = gST->ConOut->SetMode(gST->ConOut, LoopVar);

看下dsc文件,这就是模式的区别,有可能是1、2、3,看具体那种模式,一般固定好不用设置

gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn|80
gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow|25gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow|40
gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow|56

SetAttribute:设置属性,什么属性?那就是输出文字的背景是什么,黑色、红色、还是其他,但是只能是纯色,还有文字颜色,蓝色、白色、黑色、高亮、低亮啥的:

gST->ConOut->SetAttribute( gST->ConOut, EFI_BACKGROUND_BLACK | EFI_LIGHTGRAY );

ClearScreen:清屏,看名字就能看出来:

gST->ConOut->ClearScreen( gST->ConOut );

EnableCursor:设置光标,也就是屏幕上会来个光标,当然前提得为TRUE

gST->ConOut->EnableCursor( gST->ConOut, TRUE );

SetCursorPosition:设置光标位置:

gST->ConOut->SetCursorPosition (gST->ConOut, Col, Row);

ok,上述输出的功能就已经写完了,输入的就不写了,部分没实践,特别是这个reset,是不是清屏有待验证

这篇关于UEFI原理与编程实践--EFI System Table中的输入输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038265

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro