基础知识
在书中本章主要说明了系统表,启动服务,运行时服务。
挑简单明了的:系统表(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);
代码的前后顺序(什么时候用,用在哪)就看自己代码怎么使用了,原理是一样的。