很早之前,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
































