variable Architecture Protocol 的安装

Variable Architectue Protocol 是PI 规范中定义的架构协议。安装此协议的驱动是个运行时驱动。

它负责注册Variable 的运行时服务(variable runtime services). uefi 规范定义了4个Variable 

运行时服务: GetVariable, GetNextVariableName, SetVariable 和 QueryVariableInfo。

MdeModulePkg\Universal\Variable\RuntimerDxe\VariableDxe.c

SystemTable->RuntimeServices->GetVariable = VariableSericeGetVariable;

SystemTable->RuntimeSerivices->GetNextVariableName = 

VariableSericeGetNextVarialeName;

SystemTable->RuntimeSerivices->QueryVariableInfo = VariableSerivceQueryVariableInfo;

//

// Now install the variable Runtime Architectural protocol on a new handle.

//

Status = gBS->InstallProtocolInterface(

                     &mHandle,

                      &gEfiVariableArchProtocolGuid,

                       EFI_NATIVE_INTERFACE,

                        NULL

                      );

ASSERT_EFI_ERROR(Status);

4个Variable 服务接口的注册。

Variable Architecture Protocol 的安装

Variable Write Architecture Protocol 的安装

Variable Write Architecture Protocol 也是PI 规范中定义的架构协议。该协议的安装意味着非

易失性变量(Non volative Variable ) 读写的操作已经就绪。跟易失性变量的操作不同, 

Non volatile variable 读写需要借助于底层接口来操作非易失性存储介质,如flash 芯片。

//

// Now install the variable Runtime Architecture protocol on a new handle.

//

Status = gBS->InstallProtocolInterface(

                          &mHandle,

                           &gEfiVariableArchProtocolGuid,

                             EFI_NATIVE_INTERFACE,

                               NULL

                          );

ASSERT_EFI_ERROR(Status);

//

// Register FtwNotificationEvent() notify function .

 //

EfiCreateProtocolNotifyEvent(

 &gEfiFaultTolerantWriteProtoclGuid,

TPL_CALLBACK,

 FtwNotificationEvent,

(VOID *) SystemTable,

&mFtwRegistration

);

注册Notfy 函数 ftwNotificationEvent() , 当EfiFaultTolerantWriteProcol 安装,执行该函数。

Variable 相关关键数据结构

MdeModulePkg\Universal\Variable\RuntimeDxe\Variable.h

typedef struct {

     EFI_PHYSICAL_ADDRESS    VolatileVarialeBase;

     EFI_PHYSICAL_ADDRESS    NonVolatileVariableBase;

     EFI_LOCK                           VariableServicesLock;

    UINT32                                   ReentrantState;

}  VARIABLE_GLOBAL;

typedef struct {

   VARIABLE_GLOBAL  VariableGlobal;

   UINTN                       VolatileLastVariableOffset;

   UINTN                        NonVolatileLastVarialeOffset;

    UINTN                       CommonVariableTotaolSize;

    UINTN                       *PlatformLangCodes;

    CHAR8                       *LangCodes;

   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbInstance;

}  VARIABLE_MODULE_GLOBAL;

VARIABLE_MODULE_GLOBAL 结构描述了全局分配的资源。其中, VARIABLE_

猜你喜欢

转载自blog.csdn.net/robinsongsog/article/details/106521762
今日推荐