2010年10月2日 星期六

Variable Service

EFI BIOS使用Variable來儲存各個配置設定,通常存放於NVRAM或CMOS中,這部分就看IBV如何訂定,在DXE階段後可使用Runtime Services所提供的三個服務來存取Variable,基本上一個Variable是由Name、GUID與Data所組成,但其在記憶體中並沒有一定的順序性,所以要找到一個Data就得靠Name和GUID所提供的Index來取得,先介紹這三個Services。

GetNextVariableName(
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName,
IN OUT EFI_GUID *VendorGuid
);
可以透過傳進去的Name與GUID來得到它下一個Name與GUID,並傳出Name的實際Size,如果您不知道任何的Name與GUID的話,此時可填入空的Name與GUID,便會將第一組傳回。

GetVariable(
 IN CHAR16 *VariableName,
 IN EFI_GUID *VendorGuid,
 OUT UINT32 *Attributes OPTIONAL,
 IN OUT UINTN *DataSize,
 OUT VOID *Data
);
可傳回對應Name與GUID的Data,要傳出的Data要先為它配置好一個空間(動態或靜態皆可),如果不知道Data的Size,此時可先傳入一個非0的Size,它會將實際的Size傳出,並傳回EFI_BUFFER_TOO_SMALL的錯誤訊息,接下來再動態配置空間即可。

SetVariable(
 IN CHAR16 *VariableName,
 IN EFI_GUID *VendorGuid,
 IN UINT32 Attributes,
 IN UINTN DataSize,
 IN VOID *Data
);
將傳入的Data寫入至對應的Name與GUID。

Attributes:
#define EFI_VARIABLE_NON_VOLATILE 0x00000001
#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002
#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004
#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x00000008
#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010

沒有留言:

張貼留言