Mappare un indirizzo di memoria a una variabile [duplicato]

Aug 18 2020

Come associo un indirizzo di memoria a una variabile per creare una struttura in quella posizione di memoria? Ho provato il seguente pezzo di codice per creare una struttura all'indirizzo di memoria specificato, ma semplicemente scarica l'errore di segmentazione?

La posizione di memoria nel codice è una regione di input in cui è necessario impostare determinati dati e suonare il campanello con un codice operativo in modo che la CPU raccolga i dati di input e faccia ciò che il codice operativo dice che fa con i dati nella regione di input

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

Risposte

1 eerorika Aug 17 2020 at 22:43

Mappare un indirizzo di memoria a una variabile

Non è possibile in C ++ scegliere la posizione esatta di qualsiasi variabile. Puoi scegliere solo la classe di archiviazione: automatica, statica o locale di thread. L'implementazione del linguaggio sceglie l'indirizzo.

Come faccio a mappare un indirizzo di memoria su ... per creare una struttura in quella posizione di memoria?

È possibile creare un oggetto con memoria dinamica (che non è una variabile) in qualsiasi indirizzo di memoria purché tale memoria sia allocata e non contenga oggetti non banali. Può essere ottenuto utilizzando posizionamento nuova espressione o alcune funzioni standard che eseguono il posizionamento nuovo internamente.

Non c'è modo in C ++ standard per allocare memoria da indirizzi arbitrari. L'implementazione del linguaggio si occupa dell'allocazione della memoria per variabili e oggetti dinamici.

Su sistemi embedded senza memoria virtuale, l'implementazione del linguaggio può documentare intervalli di indirizzi di memoria specifici come allocati. In tal caso, puoi semplicemente usare il posizionamento nuovo per creare oggetti in quella memoria. L'utilizzo di tali indirizzi non sarà trasferibile su altri sistemi.


Che ne dici di un modo non standard? Sì, potrebbe esistere. Ad esempio, lo standard POSIX specifica la mmapfunzione:

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

Il parametro flagsfornisce altre informazioni sulla gestione dei dati mappati. Il valore di flag è l'OR bit per bit di queste opzioni, definito in <sys / mman.h>:

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

Quando MAP_FIXEDè impostato nell'argomento flags, l'implementazione viene informata che il valore di pa deve essere addresattamente.

Considera tuttavia quanto segue dalle manpage di Linux:

L'unico utilizzo sicuro di MAP_FIXEDè dove l'intervallo di indirizzi specificato da addre length era stato precedentemente riservato utilizzando un'altra mappatura; in caso contrario, l'uso di MAP_FIXEDè pericoloso perché rimuove forzatamente le mappature preesistenti, rendendo facile per un processo multithread danneggiare il proprio spazio degli indirizzi.