很早之前,BIOS如果想把一些值传递给OS,通常都是使用CMOS的。但是这样的方法有着下面的缺点:复杂度高,需要和使用位置的人协商,否则没人知道你放在CMOS中什么地方
不确定性大,可能会在代码中冲突,无法确定别人是否也用到你选择的那个CMOS位
每次传递值少,CMOS一般也就128 BYTES,很容易耗尽。
现在进化到了UEFI的时代,可以在 Shell 上将一些内容存放在内存中,然后轻松的传输到Windows中。这里只是演示这种做法,总体来说还是非常简单的。
最关键的函数就是下面这个:
Status = pBS->AllocatePool(EfiReservedMemoryType, Hdr1->Length, &Ptr);
#include <Uefi.h> #include <Library/UefiLib.h> #include <Library/ShellCEntryLib.h> #include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <Protocol/EfiShell.h> #include <Library/ShellLib.h> #include <Protocol/SimpleFileSystem.h> #include <Protocol/BlockIo.h> #include <Library/DevicePathLib.h> #include <Library/HandleParsingLib.h> #include <Library/SortLib.h> #include <Library/MemoryAllocationLib.h> #include <Library/BaseMemoryLib.h> extern EFI_SYSTEM_TABLE *gST; extern EFI_BOOT_SERVICES *gBS; int EFIAPI main ( IN int Argc, IN char **Argv ) { EFI_STATUS Status; UINT8 *Buffer; Status = gBS -> AllocatePool (EfiACPIMemoryNVS, 0x100 , & Buffer); * Buffer = 'L'; *(Buffer+1) = 'A'; *(Buffer+2) = 'B'; *(Buffer+3) = '-'; *(Buffer+4) = 'Z'; *(Buffer+5) = '.'; *(Buffer+6) = 'C'; *(Buffer+7) = 'O'; *(Buffer+8) = 'M'; *(Buffer+9) = '1'; printf("Memory1 [%x]\n",Buffer); //Status = gBS -> FreePool (Buffer); Status = gBS -> AllocatePool (EfiReservedMemoryType, 0x100 , & Buffer); * Buffer = 'L'; *(Buffer+1) = 'A'; *(Buffer+2) = 'B'; *(Buffer+3) = '-'; *(Buffer+4) = 'Z'; *(Buffer+5) = '.'; *(Buffer+6) = 'C'; *(Buffer+7) = 'O'; *(Buffer+8) = 'M'; *(Buffer+9) = '2'; printf("Memory2 [%x]\n",Buffer); return EFI_SUCCESS; }
再检查一下E820 Table,可以看到放置字符串的内存已经被标记为占用
之后,我们在实体机器上运行,首先还是shell下面写,然后到Windows中读取对应的内存。可以看到我们在对应的内存中能够看到写入的String.
因此,这个方法是可行的。
代码下载
Mem2OS