Mapeie um endereço de memória para uma variável [duplicado]
Como mapeio um endereço de memória para uma variável para criar uma estrutura naquele local de memória? Tentei o seguinte trecho de código para criar uma estrutura no endereço de memória fornecido, mas ele simplesmente descarta a falha de segmentação.
A localização da memória no código é uma região de entrada onde eu preciso definir certos dados e tocar a campainha com um opcode para que a CPU pegue os dados de entrada e faça o que o opcode diz que faz com os dados na região de entrada
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
Respostas
Mapeie um endereço de memória para uma variável
Não há como em C ++ escolher a localização exata de qualquer variável. Você só pode escolher a classe de armazenamento: automático, estático ou local de segmento. A implementação da linguagem escolhe o endereço.
Como mapeio um endereço de memória para ... para criar uma estrutura naquele local de memória?
É possível criar um objeto com armazenamento dinâmico (que não é uma variável) em qualquer endereço de memória, desde que essa memória seja alocada e não contenha objetos não triviais. Isso pode ser conseguido usando a nova expressão de posicionamento ou algumas funções padrão que realizam a nova colocação internamente.
Não há nenhuma maneira no C ++ padrão de alocar memória de um endereço arbitrário. A implementação da linguagem cuida da alocação de memória para variáveis e objetos dinâmicos.
Em sistemas embarcados sem memória virtual, a implementação da linguagem pode documentar intervalos de endereços de memória específicos conforme alocados. Nesse caso, você pode simplesmente usar o novo posicionamento para criar objetos naquela memória. O uso de tais endereços não será portátil para outros sistemas.
Que tal uma forma fora do padrão? Sim, pode existir. Por exemplo, o padrão POSIX especifica a mmap
função:
pa=mmap(addr, len, prot, flags, fildes, off);
O parâmetro
flags
fornece outras informações sobre o tratamento dos dados mapeados. O valor dos sinalizadores é o OR inclusivo bit a bit dessas opções, definido em <sys / mman.h>:Symbolic Constant Description MAP_SHARED Changes are shared. MAP_PRIVATE Changes are private. MAP_FIXED Interpret addr exactly.
Quando
MAP_FIXED
configurado no argumento flags, a implementação é informada que o valor de pa deve seraddr
, exatamente.
Considere, no entanto, o seguinte nas páginas de manual do Linux:
O único uso seguro para
MAP_FIXED
é quando o intervalo de endereços especificado poraddr
e o comprimento foram reservados anteriormente usando outro mapeamento; caso contrário, o uso deMAP_FIXED
é perigoso porque remove forçosamente mapeamentos preexistentes, tornando mais fácil para um processo multithread corromper seu próprio espaço de endereço.