Сопоставьте адрес памяти с переменной [дубликат]

Aug 18 2020

Как сопоставить адрес памяти с переменной, чтобы создать структуру в этом месте памяти? Я пробовал следующий фрагмент кода для создания структуры по заданному адресу памяти, но он просто сбрасывает ошибку сегментации?

Ячейка памяти в коде - это область ввода, где мне нужно установить определенные данные и позвонить в дверной звонок с кодом операции, чтобы ЦП забирал входные данные и делал то, что код операции говорит, что он делает с данными в области ввода.

    some_struct* some_struct_obj= (some_struct*)0xc321000000;
    memset(some_struct_obj, 0x00, sizeof(some_struct));

Ответы

1 eerorika Aug 17 2020 at 22:43

Сопоставьте адрес памяти с переменной

В C ++ нет возможности выбрать точное местоположение какой-либо переменной. Вы можете выбрать только класс хранения: автоматический, статический или локальный поток. Реализация языка выбирает адрес.

Как мне сопоставить адрес памяти с ... для создания структуры в этом месте памяти?

Можно создать объект с динамической памятью (которая не является переменной) по любому адресу памяти, если эта память выделена и не содержит нетривиальных объектов. Этого можно добиться с помощью выражения размещения new или некоторых стандартных функций, выполняющих внутреннее размещение new.

В стандартном C ++ нет способа выделить память с произвольного адреса. Реализация языка заботится о выделении памяти для переменных и динамических объектов.

Во встроенных системах без виртуальной памяти реализация языка может задокументировать определенные диапазоны адресов памяти как выделенные. В таком случае вы можете просто использовать новое размещение для создания объектов в этой памяти. Использование таких адресов не будет переносимым в другие системы.


Как насчет нестандартного способа? Да, может быть. Например, стандарт POSIX определяет mmapфункцию:

pa=mmap(addr, len, prot, flags, fildes, off);

Параметр flagsпредоставляет другую информацию об обработке сопоставленных данных. Значением флагов является побитовое ИЛИ этих параметров, определенное в <sys / mman.h>:

Symbolic Constant  Description
MAP_SHARED         Changes are shared.
MAP_PRIVATE        Changes are private.
MAP_FIXED          Interpret addr exactly.

Когда MAP_FIXEDустановлено в аргументе flags, реализация информируется о том, что значение pa должно быть addrточно.

Однако обратите внимание на следующие справочные страницы Linux:

Единственное безопасное использование MAP_FIXED- это когда диапазон адресов, указанный с помощью addrи длина, ранее был зарезервирован с использованием другого сопоставления; в противном случае использование MAP_FIXEDможет быть опасным, поскольку оно принудительно удаляет существующие сопоставления, что упрощает многопоточному процессу повреждение собственного адресного пространства.