我处于身份映射的内存上下文(x86_64平台上的UEFI),我想将一些连续的内存内容转储到结构中。假设我的结构是这样的形状:
typedef struct _mystr {
char char_arr[7];
uint32_t u_d;
uint8_t u_b;
} __attribute__((packed)) mystr;
假设我在mem_ptr
中有请求内存的偏移量0的地址,将其内容复制到mystr
实例的最佳方法是什么?有没有一种方法可以做到这一点,而不用循环遍历内存(这看起来超级无聊)?
EDIT: Nicolas Jean建议使用memcpy
,但不幸的是,在EFI
开发环境中使用C标准库几乎没有意义。然而,gnu-efi
中的efilib.h
有 CopyMem(IN VOID * dst, IN CONST VOID * src, IN UINTN len)
执行相同的任务。
使用memcpy复制内存内容可能是您正在寻找的。
mystr mystr_instance;
memcpy(&mystr_instance, mem_ptr, sizeof(mystr_instance));
正如您已经正确识别的那样,memcpy在UEFI环境中并不真正存在,但是CopyMem如果用于编译到固件映像中的某些内容,则工作良好。
对于驱动程序或应用程序,您最好使用gBS->CopyMem()引导服务。
假设内存的格式是正确的,您可以强制转换指向地址的指针,或者将数据memcpy放入结构体