系统变量服务是运行时服务提供的服务,用来操作系统变量。
包括读取系统变量的GetVariable,新建或更改变量的setVariable,遍历系统变量的GetNextVariableName。
要使用自己的系统变量,需要在.h头文件中定义GUID,在dec文件中注册一个相同的GUID,同时需要在inf中包含。
在头文件中的定义:在哪个包下的头文件定义GUID就需要在哪个包的dec中的Guids中写入
#define EFI_RESET_TIMES_ID \
{ \
0x4ae7e1e8, 0x9dfe, 0x4e3e, { 0x85, 0xb4, 0xa5, 0xf6, 0xab, 0xd4, 0x70, 0xfb }\
}
extern EFI_GUID gEfiResetTimesVariableGuid;
此GUID是在Uefi.h中定义的,所以需要在MdePkg.dec中添加
[Guids]
gEfiResetTimesVariableGuid = { 0x4ae7e1e8, 0x9dfe, 0x4e3e, { 0x85, 0xb4, 0xa5, 0xf6, 0xab, 0xd4, 0x70, 0xfb }}
inf文件下的GUID模块:添加自定义的GUID 同时Packages中需要包含.h所在的包的dec文件
[Guids]
gEfiFileSystemInfoGuid
gEfiFileInfoGuid
gEfiResetTimesVariableGuid
如此便可在程序中使用自定义的Variable。
例:
UINTN changeVariable(){
EFI_STATUS status=0;
UINTN size=10,initTimes=2000;
UINTN oldtimes=0;
status = gRT->GetVariable((CHAR16 *)L"resetTimes",&gEfiResetTimesVariableGuid,NULL,&size,&oldtimes);//resetTime为自定义的系统变量来设置开机次数,存储在非易失性存储器中
if(status==EFI_NOT_FOUND){
status = gRT->SetVariable((CHAR16 *)L"resetTimes",&gEfiResetTimesVariableGuid,EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,size,&initTimes);
}else{
oldtimes--;
status = gRT->SetVariable((CHAR16 *)L"resetTimes",&gEfiResetTimesVariableGuid,EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,size,&oldtimes);
}
printf("last times:%d\n",oldtimes);
return oldtimes;
}
dec文件和dsc文件用来描述和编译包,inf文件用来描述和编译模块。
dec文件定义了公开的数据和接口以便其它模块使用。可进行声明GUID,对外提供库等操作。
dsc文件用来描述模块,库和组件如何编译,可设定编译器参数,提供模块所使用的库入口,指定编译文件等操作。
inf文件是模块的工程文件,描述了模块的属性,比如依赖了什么库,由哪些代码组成。