UEFI学习-Variable操作

Posted 毛毛虫的爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UEFI学习-Variable操作相关的知识,希望对你有一定的参考价值。

app中进行Variable的读写操作

/** @file
  This sample application bases on HelloWorld PCD setting
  to print "UEFI Hello World!" to the UEFI Console.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <Uefi.h>
#include <Library/PcdLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>

#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/MemoryAllocationLib.h>

// String token ID of help message text.
// Shell supports to find help message in the resource section of an application image if
// .MAN file is not found. This global variable is added to make build tool recognizes
// that the help string is consumed by user and then build tool will add the string into
// the resource section. Thus the application can use '-?' option to show help message in
// Shell.
//
GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID  mStringHelpTokenId = STRING_TOKEN (STR_HELLO_WORLD_HELP_INFORMATION);

/**
  The user Entry Point for Application. The user code starts with this function
  as the real entry point for the application.

  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
  @param[in] SystemTable    A pointer to the EFI System Table.

  @retval EFI_SUCCESS       The entry point is executed successfully.
  @retval other             Some error occurs when executing this entry point.

**/
EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )

  UINT32  Index;
	EFI_STATUS Status;
	EFI_GUID Guid;
	//UINTN NameBufferSize;
	//UINTN NameSize;
	CHAR16 *Name;
	UINTN DataSize;
	UINT32 Data;
  Index = 0;
  Data = 0x1234abcd;
  Name = L"testParam";//AllocateZeroPool (NameBufferSize);
  
  DataSize = sizeof (Data);
  Status = gRT->SetVariable (
                  Name,
                  &Guid,
                  EFI_VARIABLE_NON_VOLATILE |
                  EFI_VARIABLE_BOOTSERVICE_ACCESS |
                  EFI_VARIABLE_RUNTIME_ACCESS,
                  DataSize,
                  &Data
                  );
  Print (L" [testParam] : Setvariable Data 0x%x. GUID %g ,status:%d\\n",Data,&Guid,Status);
  Data = 0;
  Status = gRT->GetVariable (Name, &Guid, NULL, &DataSize, &Data);
  Print (L" [testParam] : GetVariable Data 0x%x. status:%d\\n",Data,Status);
 
  //
  // Three PCD type (FeatureFlag, UINT32 and String) are used as the sample.
  //
  if (FeaturePcdGet (PcdHelloWorldPrintEnable)) 
    for (Index = 0; Index < PcdGet32 (PcdHelloWorldPrintTimes); Index++) 
      //
      // Use UefiLib Print API to print string to UEFI console
      //
      Print ((CHAR16 *)PcdGetPtr (PcdHelloWorldPrintString));
    
  

  return EFI_SUCCESS;



UEFI_DRIVER中进行Variable的写操作,app中进行Variable的读操作

CHAR16 *Name;
	UINTN DataSize;
	UINT32 Data;
  Data = 0x1234abc0;
  Name = L"testParam";//AllocateZeroPool (NameBufferSize);
  
  DataSize = sizeof (Data);
  Status = gRT->SetVariable (
                  Name,
                  &Guid,
                  EFI_VARIABLE_NON_VOLATILE |
                  EFI_VARIABLE_BOOTSERVICE_ACCESS |
                  EFI_VARIABLE_RUNTIME_ACCESS,
                  DataSize,
                  &Data
                  );
 // Print (L" [testParam] : Setvariable Data 0x%x. GUID %g ,status:%d\\n",Data,&Guid,Status);
	
	
	DEBUG((EFI_D_ERROR, "[testParam] : Setvariable Data 0x%x. GUID %g ,status:%d\\n",Data,&Guid,Status));
	DEBUG((EFI_D_ERROR, "lfmq:this is lfmq testing!!!\\n"));
/* DataSize = sizeof (Data);
  Status = gRT->SetVariable (
                  Name,
                  &Guid,
                  EFI_VARIABLE_NON_VOLATILE |
                  EFI_VARIABLE_BOOTSERVICE_ACCESS |
                  EFI_VARIABLE_RUNTIME_ACCESS,
                  DataSize,
                  &Data
                  );
  Print (L" [testParam] : Setvariable Data 0x%x. GUID %g ,status:%d\\n",Data,&Guid,Status);*/
  Data = 0;
  Status = gRT->GetVariable (Name, &Guid, NULL, &DataSize, &Data);
  Print (L" [testParam] : GetVariable Data 0x%x. GUID %g , status:%d\\n",Data,&Guid,Status);
 

以上是关于UEFI学习-Variable操作的主要内容,如果未能解决你的问题,请参考以下文章

统一可扩展固件接口UEFI概念学习

BIOS学习笔记之UEFI模块机制

重新学习ubuntu -- 学习UEFI 引导安装系统

UEFI学习——GetNextVariableName()

UEFI学习——GetNextVariableName()

uefi基础学习----基本的efi架构