2012-06-09 12 views
7

Mam pytanie, kiedy zlokalizowałem adres w jądrze. Wstawić moduł powitania w jądrze, w tym module, umieścić te rzeczy:Adres w jądrze

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

myślę, że mogę dostać adres fizyczny mystring, ale co ja znalazłem to w syslog, wydrukowany adres nim jest 0x38dd0000. Jednak porzuciłem pamięć i stwierdziłem, że jej prawdziwy adres to dcd2a000, który jest zupełnie inny od poprzedniego. Jak to wyjaśnić? Zrobiłem coś źle? Dzięki

PS: Użyłem narzędzia do zrzutu całej pamięci, adresów fizycznych.

+0

Kiedy „dumpingowy pamięci”, nie dostał wirtualnych adresów tam? –

+0

Pamięć, którą porzuciłem to adres fizyczny, użyłem narzędzia – Alex

+2

co to jest platforma sprzętowa? – shodanex

Odpowiedz

7

Według Man page of VIRT_TO_PHYS

zwróconego adres fizyczny jest fizycznym (CPU) Nakładanie na adres pamięci podane. Ważne jest, aby korzystać z tej funkcji tylko na adresach bezpośrednio mapowanych lub przydzielonych przez kmalloc.

Ta funkcja nie daje mapowań magistrali dla transferów DMA. W prawie wszystkich możliwych przypadkach sterownik urządzenia nie należy używać tej funkcji

Spróbuj przydzielania pamięci dla mystring użyciu kmalloc pierwszy;

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

Oto implementacja strcpy znaleźć here:

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

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

Użyłem tego, ale są błędy, najpierw jest to, że kmalloc powinien mieć dwa argumenty, więc dodałem GEL_KERNEL, drugie jest w linii strcpy, myślę, że 'strcpy' nie jest akceptowane ... więc jak mogę to rozwiązać, dziękuję – Alex

+1

Haha, woops! Niestety, minęło około 6 miesięcy od kiedy dotknąłem jądra. Jeśli chodzi o strcpy, powinieneś być w stanie '#include ', jeśli twoje źródło kernela je posiada. Lub możesz napisać własną. – Anthony

+0

dziękuję! Dużo! Ale kiedy to zrobię, również dwa błędy, jeden to 'char * mystring = kmalloc (19, GFP_KERNEL);' błąd to 'element inicjalizujący nie jest stały', inny to' strcpy (mystring, "to jest mój adres"); 'polecenie, błąd jest' oczekiwany ')' przed ciągiem stałym 'Już dodałem funkcję strcpy, którą tutaj napisałeś, dzięki! – Alex

Powiązane problemy