C 如何快速将原始内存转储到结构中?

C 如何快速将原始内存转储到结构中?,c,memory,uefi,gnu-efi,C,Memory,Uefi,Gnu Efi,我在一个身份映射内存上下文(x86_64平台上的UEFI)中,我想将一些连续内存内容转储到一个结构中。假设我的结构有这样的形状: typedef struct _mystr { char char_arr[7]; uint32_t u_d; uint8_t u_b; } __attribute__((packed)) mystr; 假设我在mem\u ptr中有请求内存偏移量0的地址,那么将其内容复制到mystr实例中的最佳方法是什么?有没有一种方法可以做到这一点而不用

我在一个身份映射内存上下文(x86_64平台上的UEFI)中,我想将一些连续内存内容转储到一个结构中。假设我的结构有这样的形状:

typedef struct _mystr {
    char char_arr[7];
    uint32_t u_d;
    uint8_t u_b;
} __attribute__((packed)) mystr;
假设我在
mem\u ptr
中有请求内存偏移量0的地址,那么将其内容复制到
mystr
实例中的最佳方法是什么?有没有一种方法可以做到这一点而不用循环遍历内存(这看起来非常无聊)



EDIT:Nicolas Jean建议使用
memcpy
,但不幸的是,在
EFI
开发环境中,使用C标准库毫无意义。但是,
gnu efi
中的
efilib.h
具有
CopyMem(在VOID*dst中,在CONST VOID*src中,在UINTN len中)执行相同任务的

假设内存的格式正确,则可以将指针强制转换为地址或将数据存储到结构中

假设内存的格式正确,则可以将指针强制转换为地址或将数据存储到结构中

复制内存内容使用memcpy可能是您想要的。

mystr mystr_instance;
memcpy(&mystr_instance, mem_ptr, sizeof(mystr_instance));

使用memcpy复制内存内容可能是您想要的。

mystr mystr_instance;
memcpy(&mystr_instance, mem_ptr, sizeof(mystr_instance));

正如您正确识别的那样,memcpy在UEFI环境中并不真正存在,但是如果将CopyMem用于编译到固件映像中的某些内容,则可以很好地工作


对于驱动程序或应用程序,最好使用gBS->CopyMem()引导服务。

正如您正确识别的那样,memcpy在UEFI环境中并不存在,但如果用于编译到固件映像中的某些内容,CopyMem工作得很好


对于驱动程序或应用程序,最好使用gBS->CopyMem()启动服务。

一系列重复的分配不是比循环更无聊吗?;)在纯C中以一种定义良好的方式不容易做到,而且您已经牺牲了可移植性;建议您使用内联程序集。在结构中,您可能会遇到跨越单词边界的数据问题。可能会在某些平台上导致崩溃。@doron没有_属性_((打包))来防止此类问题?打包的意思是结构内部没有间隙。访问数据将取决于平台。一系列重复的任务不是比循环更无聊吗?;)在纯C中以一种定义良好的方式不容易做到,而且您已经牺牲了可移植性;建议您使用内联程序集。在结构中,您可能会遇到跨越单词边界的数据问题。可能会在某些平台上导致崩溃。@doron没有_属性_((打包))来防止此类问题?打包的意思是结构内部没有间隙。访问数据将取决于平台。问题使用了
packed
属性,因此应该可以工作。标记为已接受,您的答案以某种方式解决了我的问题(请参见编辑)。问题使用
packed
属性,因此应该可以工作。标记为已接受,您的答案以某种方式解决了我的问题(请参见编辑).哇,我没有注意到启动服务,谢谢你指出。对于驱动程序和应用程序,使用BS->CopyMem比efilib的CopyMem有什么优势?首先,为了使用CopyMem,首先需要在.efi中包含BaseMemoryLib,增加大小。还有一个(更理论化的)方面,引导服务可以针对正在执行的平台进行更优化。哇,我没有注意到引导服务,谢谢你指出它。对于驱动程序和应用程序,使用BS->CopyMem比efilib的CopyMem有什么优势?首先,为了使用CopyMem,首先需要在.efi中包含BaseMemoryLib,增加大小。还有一个(更理论化的)方面,引导服务可以针对正在执行的平台进行更优化。