2012-06-09 16 views
7

Ho una domanda quando ho individuato l'indirizzo nel kernel. Inserisco un modulo ciao a partire dal kernel, in questo modulo, ho messo queste cose:L'indirizzo nel kernel

char mystring[]="this is my address"; 
printk("<1>The address of mystring is %p",virt_to_phys(mystring)); 

penso di poter ottenere l'indirizzo fisico di mystring, ma quello che ho trovato è, in syslog, l'indirizzo stampato di esso è 0x38dd0000. Tuttavia, ho scaricato la memoria e ho trovato che il vero indirizzo di esso è dcd2a000, che è molto diverso da quello precedente. Come spiegarlo? Ho fatto qualcosa di sbagliato? Grazie

PS: Ho utilizzato uno strumento per scaricare l'intera memoria, gli indirizzi fisici.

+0

Quando si "mollato la memoria", non ha ottenuto gli indirizzi virtuali lì? –

+0

La memoria che ho scaricato è l'indirizzo fisico, ho usato uno strumento – Alex

+2

qual è la piattaforma hardware? – shodanex

risposta

7

Secondo il Man page of VIRT_TO_PHYS

L'indirizzo fisico restituito è il (CPU) mappatura fisica per l'indirizzo di memoria data. È valido solo per utilizzare questa funzione su indirizzi direttamente mappati o allocati tramite kmalloc.

Questa funzione non fornisce i mapping del bus per i trasferimenti DMA. In quasi tutti i casi immaginabili un driver di dispositivo non dovrebbe usare questa funzione

Prova assegnazione della memoria per mystring utilizzando kmalloc primo;

char *mystring = kmalloc(19, GFP_KERNEL); 
strcpy(mystring, "this is my address"); //use kernel implementation of strcpy 
printk("<1>The address of mystring is %p", virt_to_phys(mystring)); 
kfree(mystring); 

Ecco un'implementazione di strcpy trovato here:

char *strcpy(char *dest, const char *src) 
{ 
    char *tmp = dest; 

    while ((*dest++ = *src++) != '\0') 
      /* nothing */; 
    return tmp; 
} 
+0

Ho usato questo, ma ci sono errori, in primo luogo kmalloc dovrebbe avere due argomenti, quindi ho aggiunto GEL_KERNEL, il secondo è nella linea strcpy, penso che 'strcpy' non è accettato ... quindi come posso risolverlo, grazie – Alex

+1

Haha, woops! Scusa, sono passati circa 6 mesi da quando ho toccato il kernel. Per quanto riguarda strcpy, dovresti essere in grado di "#includere ", se il tuo sorgente del kernel ne fornisce uno. O puoi scrivere il tuo. – Anthony

+0

grazie mille! Ma quando lo faccio, anche due errori, uno è 'char * mystring = kmalloc (19, GFP_KERNEL);' errore è 'elemento initializer non è costante', un altro è' strcpy (mystring, "questo è il mio indirizzo"); 'comando, l'errore è' expected ')' prima della costante di stringa' Ho già aggiunto la funzione strcpy che hai scritto qui, grazie !! – Alex

Problemi correlati