2012-07-23 9 views
7

Sto lavorando su un piccolo sistema embedded. Quando il mio linux si avvia nello spazio utente, so dove sono i miei dispositivi nella memoria fisica. Voglio mapparli in indirizzi virtuali di spazio utente. Attualmente lo sto facendo attraverso un modulo del kernel. Io uso vmalloc/kmalloc (a seconda delle dimensioni) e poi utilizzo ioremap_page_range su quegli indirizzi virtuali restituiti per mappare i miei indirizzi fisici. Non penso che sia il modo corretto di andare avanti. Prima di tutto sto allocando memoria e quindi chiedo al kernel di rimappare quello spazio di indirizzamento virtuale in uno spazio di indirizzi fisico diverso. (Inizialmente mappato fisico-> virtuale in vmcall/kmalloc è un po 'inutile perché non mi interessa quelle pagine fisiche.Questo non è assolutamente buono.)Mappatura di indirizzi fisici a indirizzo virtuale linux

Invece di questo c'è un modo migliore per mappare la memoria fisica conosciuta in utente processo spaziale. (Lo so altro che il mio processo di user space, senza gonna tocco che la memoria.)

Grazie

risposta

5

cosa si sta cercando di fare è di accesso a quello che viene chiamato IO memoria. Posso solo incoraggiare a leggere il Linux Device Drivers (LDD) libro e più in particolare il capitolo 9.

Per "allocare" tale spazio, è necessario chiamare

struct resource *request_mem_region(unsigned long start, unsigned long len, char *name) 

. Prima che il conducente può accedervi, è necessario assegnare un indirizzo virtuale, questo è fatto con una chiamata a

void *ioremap(unsigned long phys_addr, unsigned long size) 

Per assicurarsi che il driver sarà quindi lavorare su differenti architetture e/o piattaforme, assicurarsi di utilizzare un po 'di accesso funzione a tali aree (ioread8/16/32 o iowrite8/16/32 e tutte le loro varianti).

3

Nel modulo del kernel, remap_pfn_range() può essere utilizzato per convertire l'indirizzo fisico di indirizzo virtuale. Il seguente link sarà utile.

How remap_pfn_range remaps kernel memory to user space?

+0

Ho bisogno di fare mmap prima di fare remap_pfn. Tuttavia, non voglio farlo. Non ho un dispositivo collegato con quella memoria. Quindi, voglio mappare direttamente quella memoria fisica all'indirizzo virtuale. Grazie –

0

Nel modulo Kernel, remap_pfn_range() può essere utilizzato per convertire l'indirizzo fisico in indirizzo virtuale. Quando non si dispone di un dispositivo reale, è possibile: 1) creare un dispositivo virtuale e, 2) utilizzare mmap su tali dispositivi virtuali per accedere alla stessa memoria del kernel tramite rimap_pfn_range mappatura virtuale di tale processo. 3) Di solito in ambienti dedicati è possibile aggiungere altre pagine fisiche per evitare che vengano rimosse dal processo. 4) Condividete anche questi indirizzi fisici con processi diversi, ma dovrete gestire la sincronizzazione, in modo indipendente tramite altri meccanismi IPC, in modo che ogni processo assomigli a indirizzi diversi.

Problemi correlati