Un problema che hai è che stai recuperando un indirizzo virtuale, non l'indirizzo fisico in cui risiede la memoria. Al prossimo avvio, la mappatura probabilmente non sarà la stessa.
Questo può sicuramente essere fatto all'interno di un modulo del kernel in Linux, ma non penso che ci sia alcun tipo di API nello spazio utente che puoi usare.
Se hai il permesso (e presumo che potresti essere root su questa macchina se la stai riavviando), puoi dare un'occhiata a /dev/mem per vedere l'attuale layout fisico. Forse dovresti provare a campionare i valori, riavviare e vedere quanti di questi valori persistevano.
Esiste un progetto simile in cui viene dimostrato un attacco di avvio a freddo. Il codice sorgente è disponibile, forse puoi trarre ispirazione da lì.
Tuttavia, AFAIR leggono la memoria senza prima caricare un sistema operativo e quindi non devono interferire con la protezione della memoria del sistema operativo. Forse dovresti provare anche questo per evitare che la memoria venga sovrascritta o cancellata dal sistema operativo dopo l'avvio.
(Controlla anche il video sul sito, è piuttosto impressionante;)