DXE 其它服务

本文详细介绍了EDKII项目中DXE Foundation模块的两个核心功能:CoreStall函数实现的精确延时服务,以及CoreInstallConfigurationTable函数用于管理EFI系统表中的配置表。深入探讨了其内部实现机制,包括处理不同平台计时硬件差异的方法,以及配置表的查找、安装和更新流程。

EDKII 中实现DXE Foundation 的源代码位于MdeModulePkg\Core\Dxe 目录下。

/**
  Introduces a fine-grained stall.

  @param  Microseconds           The number of microseconds to stall execution.

  @retval EFI_SUCCESS            Execution was stalled for at least the requested
                                 amount of microseconds.
  @retval EFI_NOT_AVAILABLE_YET  gMetronome is not available yet

**/
EFI_STATUS
EFIAPI
CoreStall (
  IN UINTN            Microseconds
  )
{
  UINT64  Counter;
  UINT32  Remainder;
  UINTN   Index;

  if (gMetronome == NULL) {
    return EFI_NOT_AVAILABLE_YET;
  }

  //
  // Counter = Microseconds * 10 / gMetronome->TickPeriod
  // 0x1999999999999999 = (2^64 - 1) / 10
  //
  if ((UINT64) Microseconds > 0x1999999999999999ULL) {
    //
    // Microseconds is too large to multiple by 10 first.  Perform the divide
    // operation first and loop 10 times to avoid 64-bit math overflow.
    //
    Counter = DivU64x32Remainder (
                Microseconds,
                gMetronome->TickPeriod,
                &Remainder
                );
    for (Index = 0; Index < 10; Index++) {
      CoreInternalWaitForTick (Counter);
    }

    if (Remainder != 0) {
      //
      // If Remainder was not zero, then normally, Counter would be rounded
      // up by 1 tick.  In this case, since a loop for 10 counts was used
      // to emulate the multiply by 10 operation, Counter needs to be rounded
      // up by 10 counts.
      //
      CoreInternalWaitForTick (10);
    }
  } else {
    //
    // Calculate the number of ticks by dividing the number of microseconds by
    // the TickPeriod.  Calculation is based on 100ns unit.
    //
    Counter = DivU64x32Remainder (
                MultU64x32 (Microseconds, 10),
                gMetronome->TickPeriod,
                &Remainder
                );
    if (Remainder != 0) {
      //
      // If Remainder is not zero, then round Counter up by one tick.
      //
      Counter++;
    }
    CoreInternalWaitForTick (Counter);
  }

  return EFI_SUCCESS;
}

 

CoreStall() 实现了UEFI 规范中定义的Stall 服务。它的功能非常简单,就是使得运行中的程序

进行一段时间的延时,该延时是以微秒(micro-second) 为单位的。由于每种平台用于计时的芯片

组硬件是不同的而DXE Croe 的实现又要求独立于平台特性。

 

EFI_STATUS
EFIAPI
CoreInstallConfigurationTable (
  IN EFI_GUID *Guid,
  IN VOID     *Table
  )
{
  UINTN                   Index;
  EFI_CONFIGURATION_TABLE *EfiConfigurationTable;
  EFI_CONFIGURATION_TABLE *OldTable;

  //
  // If Guid is NULL, then this operation cannot be performed
  //
  if (Guid == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  EfiConfigurationTable = gDxeCoreST->ConfigurationTable;

  //
  // Search all the table for an entry that matches Guid
  //
  for (Index = 0; Index < gDxeCoreST->NumberOfTableEntries; Index++) {
    if (CompareGuid (Guid, &(gDxeCoreST->ConfigurationTable[Index].VendorGuid))) {
      break;
    }
  }

该函数的功能为向EFI 系统表(EFI System Table) 中加入, 更新或者删除一个配置表。UEFI

规范中定义了该系统表的结构,其中有一个指向配置表数组的指针ConfiguraitonTable; 该指针

指向了一系列以EFI_GUID 为标识的配置表,这些配置表的个数由系统表中的NumberOfTableEntries 来

指定。

 

通过Configuration 和NumberOfTableEntries 来遍历系统表中已经存的配置表,找寻输入的GUID

所对应的配置表。

 

 

 

### UEFI DXE 驱动程序开发教程及相关文档 UEFI(统一可扩展固件接口)是一种用于替代传统BIOS的标准,其设计目标是提供更强大的功能和更高的灵活性。DXE(Driver Execution Environment)阶段是UEFI启动过程中的一个重要部分,在此期间加载并执行各种驱动程序以初始化硬件设备。 #### 什么是DXEDXE是一个运行环境,它允许驱动程序在系统引导过程中被加载和执行。这些驱动程序负责初始化平台上的硬件组件,并为后续的操作系统或其他软件模块提供必要的服务[^1]。 #### 开发UEFI DXE驱动的基础知识 要开发UEFI DXE驱动程序,开发者需要熟悉以下几个方面: - **EDK II框架**:这是最常用的UEFI开发工具包之一,提供了丰富的库函数和支持来简化驱动程序的编写工作。 - **PI Specification (Platform Initialization)**:定义了包括DXE在内的多个UEFI阶段的行为规范。 - **协议和服务**:了解如何创建、安装以及使用不同类型的协议是非常重要的,因为它们构成了UEFI内部通信的核心机制。 对于初学者来说,《UEFI内核导读》这本书籍可以作为很好的参考资料,因为它不仅涵盖了基本概念还深入探讨了一些高级主题比如内存管理、中断处理等[^2]。 下面给出一段简单的代码示例展示了一个典型的UEFI应用入口点: ```c #include <Uefi.h> #include <Library/UefiLib.h> EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable){ Print(L"Hello World from a basic UEFI Application!\n"); return EFI_SUCCESS; } ``` 这段代码虽然只是一个基础的应用例子而非具体针对DXE驱动,但它展示了如何利用EDKII所提供的APIs来进行编程。 #### 进一步的学习资源建议 除了上述提到的内容外,还可以参考以下链接获取更多关于UEFI DXE驱动的信息: - EDK II GitHub Repository: [https://github.com/tianocore/edk2](https://github.com/tianocore/edk2) - Intel's official documentation on UEFI & PI specifications.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值