Как вывести сырую память в структуру быстро?
Я нахожусь в контексте памяти с отображением идентификаторов (UEFI на платформе x86_64), и я хочу вывести некоторое непрерывное содержимое памяти в структуру. Скажем, моя структура имеет такую форму:
typedef struct _mystr {
char char_arr[7];
uint32_t u_d;
uint8_t u_b;
} __attribute__((packed)) mystr;
Предположим, у меня есть в mem_ptr
адрес смещения запрошенной памяти 0, каков наилучший способ скопировать его содержимое в mystr
пример? Есть ли способ сделать это без перебора памяти с циклом (который кажется супер скучным)?
РЕДАКТИРОВАТЬ: Николя Жан предложил использовать memcpy
но к сожалению в EFI
При разработке контекста использование стандартной библиотеки Си не имеет смысла. Тем не мение, efilib.h
от gnu-efi
имеет CopyMem(IN VOID * dst, IN CONST VOID * src, IN UINTN len)
который выполняет ту же задачу.
3 ответа
Копирование содержимого памяти с помощью memcpy, вероятно, то, что вы ищете.
mystr mystr_instance;
memcpy(&mystr_instance, mem_ptr, sizeof(mystr_instance));
Как вы правильно определили, memcpy на самом деле не существует в среде UEFI, но CopyMem хорошо работает, если используется для чего-то, скомпилированного в образ прошивки.
Для драйверов или приложений лучше использовать службу загрузки gBS->CopyMem().
Предполагая, что память имеет правильный формат, вы можете либо привести указатель к адресу, либо записать данные в вашу структуру.