Как вывести сырую память в структуру быстро?

Я нахожусь в контексте памяти с отображением идентификаторов (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().

Предполагая, что память имеет правильный формат, вы можете либо привести указатель к адресу, либо записать данные в вашу структуру.

Другие вопросы по тегам