Mapping di memoria fisica diretta di Windows

3

Sono un po 'deluso che non c'è quasi nessuna discussione su questo, non importa dove guardo, quindi credo che dovrò chiedere.

Sto scrivendo un'applicazione di marcatura su banco di memoria multipiattaforma che richiede una mappatura diretta degli indirizzi fisici piuttosto che un indirizzamento virtuale.

Modifica La soluzione sarebbe simile alle chiamate di sistema Linux / Unix:

int fd = open("/dev/mem", O_RDONLY);
mmap(NULL, len, PROT_READ, MAP_SHARED, fd, PHYSICAL_ADDRESS_OFFSET);

che richiede al kernel di fornire una mappatura della pagina virtuale all'indirizzo fisico desiderato o di restituirla come fallita. Ciò richiede i privilegi di supervisore, ma va bene.

Ho visto molte informazioni sulla memoria condivisa e sui file mappati in memoria ma tutti questi risiedono sul disco e quindi non sono molto utili quando sto cercando di fare una lettura dipendente dal sistema. È molto simile alla scrittura di un driver IO anche se non ho bisogno di autorizzazioni di scrittura per l'indirizzo fisico.

Questo sito fornisce un esempio di come farlo a livello di driver usando Windows Driver Kit:

NT Insider: condivisione della memoria tra driver e applicazioni

Questa soluzione richiederebbe probabilmente Visual Studio a cui attualmente non ho accesso. (Ho scaricato l'API WDK ma si è lamentato del mio utilizzo di GCC per Windows).

Sono tradizionalmente un programmatore Linux quindi spero che possa esserci qualcosa di veramente semplice che mi manca. Grazie in anticipo se sai qualcosa che io non!

    
posta chrisjleaf 10.07.2012 - 21:09
fonte

2 risposte

2

Non credo che la tua comprensione di MAP_FIXED sia corretta. Questo dice al kernel di mettere la memoria mappata al dato indirizzo virtuale all'interno dello spazio di indirizzamento del processo. I processi in modalità utente utilizzano sempre l'indirizzamento virtuale. In breve, non penso che tu possa fare ciò che stai chiedendo in Windows o in qualsiasi ambiente di Unix o Linux.

    
risposta data 10.07.2012 - 21:59
fonte
2

Il motivo per cui non c'è molta discussione sulla mappatura della memoria fisica per le app dello spazio utente è che le app dello spazio utente non possono GET mappare la memoria fisica. Parte della definizione di esecuzione nello spazio utente è che si sta eseguendo in uno spazio di indirizzi virtuale privato del proprio processo.

mmap con MAP_FIXED ti consente semplicemente di dire al sistema dove mettere la memoria nello spazio degli indirizzi del processo. In altre parole, si arriva a specificare l'indirizzo virtuale in cui verrà visualizzata la memoria. NON è un indirizzo fisico in alcun modo forma o forma.

    
risposta data 10.07.2012 - 22:14
fonte

Leggi altre domande sui tag