UEFI原理与编程实践--GetVariable/SetVariable

基础知识

在书中本章主要说明了系统表,启动服务,运行时服务。

挑简单明了的:系统表(gST)的使用方法:

SystemTable->BootServes指向系统的启动服务表,ConIn/ConOut

启动服务(gBS),在上一节中protocol的安装与使用就使用了gBS,启动服务主要运用在事件管理,内存管理,protocol有关的服务,驱动管理服务,image管理服务,以及ExitBootServes。

启动服务的生存周期在DxeMain到ExitBootServes期间。

运行时服务(gRT)主要运用在:

读取设定系统时间以及唤醒设定:

  SystemTable->RuntimeServices->GetTime       = GetTime;
  SystemTable->RuntimeServices->SetTime       = SetTime;
  SystemTable->RuntimeServices->GetWakeupTime = GetWakeupTime;
  SystemTable->RuntimeServices->SetWakeupTime = SetWakeupTime;

其他服务:

gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);

现在主要说一下这个读写变量:

Variable

其实这个Variable的使用和protocol的使用是类似的,只是不需要再进行安装了,既然是variable,那就是变量,顾名思义,实质和protocol还是有很多差别的

创建GUID与.h文件

同样的,咱们把这个创建的GUID与.h文件放在自己的pkg里面,需要用的时候调用就行

在dec文件中注册一个同样的GUID

gEfiPmFvolumeVariableGuid = { 0x4ae7e1e8, 0x9dfe, 0x4e3e, { 0x85, 0xb4, 0xa5, 0xf6, 0xab, 0xd4, 0x70, 0xfb }}

.h文件

#ifndef __PM_FV_VARIABLE___H__
#define ____PM_FV_VARIABLE___H__


#define PM_FV_GUID \
  { \
     0x4ae7e1e8, 0x9dfe, 0x4e3e, { 0x85, 0xb4, 0xa5, 0xf6, 0xab, 0xd4, 0x70, 0xfb }\
  }

extern EFI_GUID gEfiPmFvolumeVariableGuid;

#define PM_FV_NAME   L"PMFV"

#pragma pack(1)

typedef struct _PM_FV_DATA{
  UINTN    BaseAddress;
} PM_FV_DATA;

#pragma pack()

#endif

创建好直接就可以使用啦,只要相应的inf包含就行,然后C文件include这个.h文件:

variable的使用

SetVariable:

PM_FV_DATA  PmFvData;
        UINTN      VariableSize;

        VariableSize = sizeof(PM_FV_DATA);
        PmFvData.BaseAddress = 1;
        Status = gRT->SetVariable (
                  PM_FV_NAME,
                  &gEfiPmFvolumeVariableGuid,
                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
                  VariableSize,
                  &PmFvData
                  );
                  
        ASSERT_EFI_ERROR (Status);

GetVariable:

 PM_FV_DATA  PmFvData;
  UINTN      VariableSize;

  VariableSize = sizeof(PM_FV_DATA);
  Status = gRT->GetVariable (
                  PM_FV_NAME,
                  &gEfiPmFvolumeVariableGuid,
                  NULL,
                  &VariableSize,
                  &PmFvData
                  );
  
  ASSERT_EFI_ERROR(Status);

代码的前后顺序(什么时候用,用在哪)就看自己代码怎么使用了,原理是一样的。

猜你喜欢

转载自blog.csdn.net/u011397314/article/details/121509288