2012-06-09 10 views
7

Ich habe eine Frage, wenn ich die Adresse im Kernel gefunden. Ich lege ein Hallo-Modul im Kernel, die in diesem Modul, ich habe diese Dinge:Die Adresse in Kernel

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

Ich glaube, ich kann die physikalische Adresse des mystring zu bekommen, aber was ich gefunden, in syslog, die gedruckte Adresse ist 0x38dd0000. Allerdings habe ich die Erinnerung verloren und festgestellt, dass die tatsächliche Adresse dcd2a000 ist, die ganz anders als die vorherige ist. Wie erklärt man das? Ich habe etwas falsch gemacht? Danke

PS: Ich benutzte ein Werkzeug, um den ganzen Speicher, physische Adressen zu entleeren.

+0

Wenn Sie „die Erinnerung abgeschoben“, Sie nicht dort virtuelle Adressen bekommen? –

+0

Der Speicher, den ich entleerte, ist die physikalische Adresse, ich habe ein Werkzeug verwendet – Alex

+2

Was ist die Hardware-Plattform? – shodanex

Antwort

7

Nach der Man page of VIRT_TO_PHYS

der zurückgegebene physikalischen Adresse ist die physikalische (CPU) für die Zuordnung der Speicheradresse angegeben. Es ist nur gültig, diese Funktion für Adressen zu verwenden, die über kmalloc direkt zugeordnet oder zugewiesen sind.

Diese Funktion gibt keine Buszuordnungen für DMA-Übertragungen. In fast allen denkbaren Fällen sollte ein Gerätetreiber diese Funktion nicht verwenden

Versuchen Sie, den Speicher für mystring mit kmalloc ersten Zuteilung;

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); 

Hier ist eine Implementierung von strcpy here gefunden:

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

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

Ich benutze so, aber es gibt Fehler, zuerst ist kmalloc sollte zwei Argumente haben, so habe ich GEL_KERNEL hinzugefügt, zweitens ist in der strcpy Linie, ich denke 'strcpy' wird nicht akzeptiert ... so wie kann ich es lösen, danke – Alex

+1

Haha, Leute! Entschuldigung, es ist ungefähr 6 Monate her, seit ich den Kernel berührte. Soweit es möglich ist, sollten Sie '# ' 'einschließen können, wenn Ihre Kernel-Quelle einen bereitstellt. Oder Sie können Ihre eigenen schreiben. – Anthony

+0

vielen Dank! Aber wenn ich es mache, gibt es auch zwei Fehler, einer ist char * mystring = kmalloc (19, GFP_KERNEL), "error is' Initialisierungselement ist nicht konstant ", ein anderer ist' strcpy (mystring, "das ist meine Adresse"); 'Befehl, der Fehler ist 'erwartet') 'vor String-Konstante' Ich habe bereits die strcpy-Funktion hinzugefügt, die Sie hier geschrieben haben, danke !! – Alex