iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >UEFI开发用户交互界面实例分析
  • 256
分享到

UEFI开发用户交互界面实例分析

2023-06-30 20:06:56 256人浏览 独家记忆
摘要

这篇“UEFI开发用户交互界面实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“UEFI开发用户交互界面实例分析”文章吧

这篇“UEFI开发用户交互界面实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“UEFI开发用户交互界面实例分析”文章吧。

前言

这里UEFI用户交互界面的实现载体是OVMF(使用QEMU启动),其形式如下:

UEFI开发用户交互界面实例分析

它一般被叫做Front Page(后面将以该名称来称呼上述的界面),其下还包括Setup,Boot Manager,Device Manager等选项。

相比Legacy BiOS,UEFI的交互界面要丰富得多,比如支持多语言,支持图片等,不过EDK默认带的还是最原始的,跟Legacy BioS类似的界面。

启动

在EDK2017的OVMF代码中,Front Page被做成一个独立的APP(跟shell一样),然后注册,可以通过在启动过程中按F2来进入,具体的注册代码如下:

VOIDPlatfORMReGISterOptionsAndKeys (  VOID  ){  EFI_STATUS                   Status;  EFI_INPUT_KEY                Enter;  EFI_INPUT_KEY                F2;  EFI_INPUT_KEY                Esc;  EFI_BOOT_MANAGER_LOAD_OPTION BootOption;  //  // Register ENTER as CONTINUE key  //  Enter.ScanCode    = SCAN_NULL;  Enter.UnicodeChar = CHAR_CARRIAGE_RETURN;  Status = EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL);  ASSERT_EFI_ERROR (Status);  //  // Map F2 to Boot Manager Menu  //  F2.ScanCode     = SCAN_F2;  F2.UnicodeChar  = CHAR_NULL;  Esc.ScanCode    = SCAN_ESC;  Esc.UnicodeChar = CHAR_NULL;  Status = EfiBootManagerGetBootManagerMenu (&BootOption);  ASSERT_EFI_ERROR (Status);  Status = EfiBootManagerAddKeyOptionVariable (             NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL             );  ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);  Status = EfiBootManagerAddKeyOptionVariable (             NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL             );  ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);}

而Front Page对应APP的驱动是UiApp.inf,它对应的GUID是:

  # Point to the MdeModulePkg/Application/UiApp/UiApp.inf  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }

在EfiBootManagerGetBootManagerMenu()函数中会根据上述的GUID寻找UiApp模块,并生成对应的启动项。

最终的结果就是启动过程中按F2就可以进入UiApp模块,其入口是InitializeUserInterface(),将在后续的内容中介绍。

UiApp模块

InitializeUserInterface()模块的大致流程如下:

UEFI开发用户交互界面实例分析

其中绿色部分涉及到交互相关的操作,后续会重点说明。

字体

字体使用一种称为Glyph的元素表示,它其实就是一个二进制的文件,里面包含了描述字体的元素,但是具体是怎么样表示的,目前还不是很清楚,这个也不是我们需要关注的重点。

这个二进制在代码中有下述的数组表示:

typedef struct {  ///  /// This 4-bytes total array length is required by HiiAddPackages()  ///  UINT32                 Length;  //  // This is the Font package definition  //  EFI_HII_PACKAGE_HEADER Header;  UINT16                 NumberOfNarrowGlyphs;  UINT16                 NumberOfWideGlyphs;  EFI_NARROW_GLYPH       NarrowArray[NARROW_GLYPH_NUMBER];  EFI_WIDE_GLYPH         Widearray[WIDE_GLYPH_NUMBER];} FONT_PACK_BIN;FONT_PACK_BIN mFontBin = {  sizeof (FONT_PACK_BIN),  {    sizeof (FONT_PACK_BIN) - sizeof (UINT32),    EFI_HII_PACKAGE_SIMPLE_FONTS,  },  NARROW_GLYPH_NUMBER,  0,  {     // Narrow Glyphs    {      0x05d0,      0x00,      {        0x00,  // 后面的省略

这个数组通过一个通过HiiAddPackages()导入,如下所示:

EFI_HII_HANDLEExportFonts (  VOID  ){  return HiiAddPackages (           &mFontPackageGuid,           gImageHandle,           &mFontBin,           NULL           );}

字符串

字符串通过UNI文件转换成,编译时在AutoGen.c中生成对应的数组,然后通过下面的函数来注册到HII数据库中:

VOIDInitializeStringSupport (  VOID  ){  gStringPackHandle = HiiAddPackages (                         &mUiStringPackGuid,                         gImageHandle,                         UiAppStrings,                         NULL                         );  ASSERT (gStringPackHandle != NULL);}

这里的UiAppStrings就是通过.uni文件生成的字符串表示。

可以看到,导入字体和字符串使用的是相同的函数。

UI Entry

进入UI界面是通过UiEntry()来实现的,其大致流程如下:

UEFI开发用户交互界面实例分析

这里的重点也主要在绿色部分,它包含了Front Page的初始化和调用。

上述的绿色部分大致流程如下所示:

UEFI开发用户交互界面实例分析

这里最重要的是两个部分,一个是更新Front Page的部分,另一个是SendForm()的部分。

更新Front Page部分主要由UpdateFrontPageBannerStrings()、UpdateFrontPageForm()等函数组成,它们使用了各类HII操作来更新界面,比如说UiCustomizeFrontPageBanner()构成了Front Page界面中的一条条的字符串显示(就是开头图片中的蓝字部分),另外还有UiCustomizeFrontPage()、HiiUpdateForm()等函数,都更新了界面。

SendForm()部分,它其实是整个UEFI界面显示的引擎,这部分实现在显示界面(比如图形输出界面,或者串口)上显示前面更新的内容,后续会详细介绍。

以上就是关于“UEFI开发用户交互界面实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: UEFI开发用户交互界面实例分析

本文链接: https://www.lsjlt.com/news/331236.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • UEFI开发用户交互界面实例分析
    这篇“UEFI开发用户交互界面实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“UEFI开发用户交互界面实例分析”文章吧...
    99+
    2023-06-30
  • UEFI开发实战用户交互界面基础说明
    目录前言启动UiApp模块字体字符串UI Entry前言 本文以vUDK2017: https://github.com/tianocore/edk2.git Tag vUDK201...
    99+
    2024-04-02
  • UEFI开发中用户交互界面如何使用
    这篇文章主要介绍“UEFI开发中用户交互界面如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“UEFI开发中用户交互界面如何使用”文章能帮助大家解决问题。作用关于UNI文件的作用,在参考文档中做...
    99+
    2023-06-30
  • UEFI开发实战用户交互界面使用说明VFR文件
    目录1. 综述2. 作用3. 语法3.1 注释3.2 预定义3.3 数据结构3.4 Forms相关表达式总览3.4.1 formset3.4.2 formset list3.5 Fo...
    99+
    2024-04-02
  • UEFI开发实战用户交互界面使用说明UNI文件
    目录综述作用语法基本定义语法说明UNI文件的使用综述 UEFI用户交互界面的实现涉及到多种不同类型的文件,这里要讲的是UNI文件,它也是其中最简单的一种。本文主要参考自《edk-ii...
    99+
    2024-04-02
  • UEFI开发基础HII代码实例分析
    这篇文章主要介绍“UEFI开发基础HII代码实例分析”,在日常操作中,相信很多人在UEFI开发基础HII代码实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”UEFI开发基础HII代码实例分析”的疑惑有所...
    99+
    2023-06-30
  • laravel使用workerman用户交互、服务器交互的示例分析
                               laravel使用workerman 用户交...
    99+
    2023-06-14
  • Android和PHP MYSQL交互开发实例
    目录总述1.安卓客户端2.服务器端3.MYSQL数据库4.总结总述 简单的说,安卓客户端通过Http向本地服务器发出请求,访问指定的php代码,服务器端通过php代码执行数据库的操作...
    99+
    2024-04-02
  • python图形用户界面的示例分析
    小编给大家分享一下python图形用户界面的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的图形用户界面python的图形用户界面msgbox...
    99+
    2023-06-26
  • Python图形用户界面与游戏开发实例详解
    目录前言基于tkinter模块的GUI基于wxPython模块的GUIPygame游戏开发1.在游戏窗口中绘图2.图形的处理3.动画效果4.碰撞检测5.事件处理总结 前言 ...
    99+
    2024-04-02
  • 用Groovy开发Swing界面Griffon 0.9.5-rc1色的示例分析
    用Groovy开发Swing界面Griffon 0.9.5-rc1色的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Griffon 团队今天发布了 Griffon ...
    99+
    2023-06-17
  • 操作系统 GUI 与图形用户界面的最佳实践:提升用户交互
    在当今数字世界,操作系统 (OS) 图形用户界面 (GUI) 对于提供无缝且直观的用户体验至关重要。通过遵循一些经过验证的最佳实践,开发人员可以创建出色的 GUI,提升用户交互并提高整体用户满意度。 一致性和可预测性 使用一致的视觉风...
    99+
    2024-03-09
    图形用户界面 (GUI) 最佳实践 操作系统 用户体验
  • Android面向单Activity开发实例分析
    这篇“Android面向单Activity开发实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android面向单Ac...
    99+
    2023-07-05
  • GUI 与图形用户界面:通往数字交互的新途径
    GUI 的演变 GUI 的历史可以追溯到 20 世纪 60 年代,当时麻省理工学院 (MIT) 的研究人员开发了 Sketchpad 系统,这是最早的图形用户界面原型。随着技术的发展,GUI 在 70 和 80 年代得到了广泛的应用,著...
    99+
    2024-03-09
    GUI、图形用户界面、用户体验、交互
  • Laravel开发实例分析
    本篇内容主要讲解“Laravel开发实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Laravel开发实例分析”吧!   准备开发环境   原教程使用...
    99+
    2024-04-02
  • Epicor开发实例分析
    Epicor开发实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。关于Epicor开发实例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很...
    99+
    2023-06-05
  • Node.js开发实例分析
    这篇文章主要讲解了“Node.js开发实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js开发实例分析”吧!1.分层组织代码例如Express.js这个应用广泛的Node.j...
    99+
    2023-06-29
  • C#开发交互式命令行应用示例
    目录前言Sharprompt介绍Demo结论前言 如果你开发过vue应用,应该对其交互式命令行印象深刻: 它允许你无需任何编程经验,仅需回答问题,就可完成vue应用创建。 虽然作为...
    99+
    2024-04-02
  • C#开发经验分享:用户体验与界面设计
    在C#开发中,界面设计是非常重要的一部分。良好的用户体验和界面设计可以提高用户的使用感受,增加软件的美观度和实用性。在这篇文章中,我将分享我在C#开发中的一些经验和技巧,帮助开发者提升用户体验和界面设计的水平。第一点,了解用户需求界面设计的...
    99+
    2023-11-22
  • 利用C++实现交互式图形界面的艺术
    在 c++++ 中使用 qt 库可以创建交互式图形界面 (gui)。首先安装 qt 库,使用 qt designer 或手动添加窗口部件,并通过连接信号与槽来响应用户交互。实战案例展示了...
    99+
    2024-05-10
    c++ 图形界面 跨平台应用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作