Linux kernel 在内核模式下在Linux上读取/写入EFI变量
我正在使用Linux UEFI。我想通过我的驱动程序代码访问efi变量。 目前我正在寻找类似efi.get\u variable()的linux/efi.h API。 但我不知道如何从我的驱动程序代码调用这些APILinux kernel 在内核模式下在Linux上读取/写入EFI变量,linux-kernel,linux-device-driver,efi,uefi,Linux Kernel,Linux Device Driver,Efi,Uefi,我正在使用Linux UEFI。我想通过我的驱动程序代码访问efi变量。 目前我正在寻找类似efi.get\u variable()的linux/efi.h API。 但我不知道如何从我的驱动程序代码调用这些API struct efi efi1; efi_init(); efi_char16_t *name = (efi_char16_t *)"Boot001"; efi_guid_t *vendor = (efi_guid_t *)"8be4df6
struct efi efi1;
efi_init();
efi_char16_t *name = (efi_char16_t *)"Boot001";
efi_guid_t *vendor = (efi_guid_t *)"8be4df61-93ca-11d2-aa0d-00e098032b8c";
u32 *attr = (u32 *)0x7;
unsigned long data_size = 1024;
void *data = NULL;
printk("\n Showing efi info \n");
stat = efi1.get_variable(name,vendor,attr,&data_size,data);
通过这段代码,我得到了数据的空值。
那么你能建议我该怎么做吗?或任何修改?尝试将代码重写为类似以下内容(注意,它未经测试):
您确定可以将
char*
强制转换为efi\u guid\u t*
?和u32*attr=(u32*)0x7代码>看起来非常非常错误。在初始化efi1之前,您还使用了efi1
。此外,我认为您不需要调用efi_init
——这是在启动时完成的。@tangrs,我不知道如何初始化efi1并访问这些变量,所以您能建议任何修改吗?这非常有用。多谢各位@码流
efi_char16_t name[] = L"Boot0001";
efi_guid_t guid = EFI_GLOBAL_VARIABLE_GUID;
u32 attr;
unsigned long data_size = 0;
u8 *data = NULL;
efi_status_t status;
/* Get real size of UEFI variable */
status = efi.get_variable(name,&guid,&attr,&data_size,data);
if (status == EFI_BUFFER_TOO_SMALL) {
/* Allocate data buffer of data_size bytes */
data = (u8*)vmalloc(data_size);
if (!data) {
/* Your handling here */
}
/* Get variable contents into buffer */
status = efi.get_variable(name,&guid,&attr,&data_size,data);
if (status != EFI_SUCCESS) {
/* Your handling here */
}
else {
/* Variable is now in data */
}
}
else if (status == EFI_NOT_FOUND) {
/* There is no Boot0001 variable. Try Boot0000 maybe? */
}
else {
/* Your handling here */
}