2012-02-09 6 views
7

Desidero impostare un intervallo di memoria non memorizzabile (Linux, x86-86) all'interno di un processo spazio utente. This question si avvicina, ma menziona solo i registri MTRR che funzionano con la memoria fisica. Voglio farlo usando le tabelle PAT poiché offrono un controllo più fine, consentono di impostare la memoria virtuale non memorizzabile pagina per pagina.Imposta memoria come non memorizzabile attraverso la tabella PAT x86

La documentazione di Linux, Documentation/x86/pat.txt, suggerisce che ci dovrebbe essere qualcosa con mmap e un flag SYNC, ma non riesco a trovare come farlo in pratica. Idealmente, mi piacerebbe usare una chiamata come mprotect(address, range, O_UNCACHABLE).

+0

Sono 'madvise' /' mlock' sufficienti? –

+0

No, sembra che questi abbiano effetto solo sulla mappatura virtuale (se le pagine sono in RAM o su disco), ma non sembrano influenzare il caching ... – Wim

+0

Sì, ho frainteso. :( –

risposta

2

Si consiglia di scrivere un modulo del kernel per fornire l'interfaccia necessaria per un processo a livello utente. All'interno del modulo del kernel è possibile utilizzare set_memory_uc per controllare gli attributi della pagina.

Per quanto riguarda il simulatore: dovrebbe essere da dieci a mille volte più lento, non un milione di volte, a meno che non si simuli a livello di gate. Non dimenticare di prendere in considerazione il tempo necessario per scrivere il modulo del kernel. Se sono necessarie alcune settimane per scrivere e eseguire il debug del modulo, potrebbe essere preferibile utilizzare un simulatore per un singolo esperimento.

0

Secondo vari sviluppatori domande su piattaforme ARM il codice sarebbe:

fd = open("/dev/mem", O_RDWR|O_SYNC); 
uptr = mmap(addr, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fd, off); 

ref:

+0

Con questo codice è possibile accedere a un intervallo di indirizzi fisici ma è necessario anche riservarlo o in qualche modo dire al kernel di non usarlo. Se non fai brutte cose succederà ... –

Problemi correlati