Mapeie um endereço de memória para uma variável [duplicado]

Aug 18 2020

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

1 eerorika Aug 17 2020 at 22:43

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 mmapfunção:

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

O parâmetro flagsfornece 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_FIXEDconfigurado no argumento flags, a implementação é informada que o valor de pa deve ser addr, 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 por addre o comprimento foram reservados anteriormente usando outro mapeamento; caso contrário, o uso de MAP_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.