Ich habe einen Char-Treiber, in dem eine der Schnittstellenfunktionen, die ich hinzugefügt habe, alloc_contig(int order)
ist, wo Reihenfolge log2 der gewünschten Anzahl von 4K-Seiten ist. Diese Funktion weist den zusammenhängenden physischen Speicher zu und ordnet ihn für die Verwendung des Benutzerbereichs unter Verwendung der remap_pfn_range
-Funktion zu. Ich versuche, Funktion zu schreiben, die diesen Speicher freigibt dealloc_contig(va)
jetzt im Kernel Ich habe die virtuelle Adresse vom Benutzer frei gegeben und ich muss die zugrunde liegende physikalische Adresse zu erhalten, also habe ich versucht, virt_to_phys
zu verwenden, aber es gibt mir nicht die gewünschte Adresse. Log:Virtuelle zu Kernel logische Adresse
//allocating
page address is ffff880868764000 //allocated using alloc_pages
//deallocating
virtual address from user 7f4c7e095000
when converted to PA using virt_to_phys got f74c7e095000 instead of ffff880868764000
Können Sie mir bitte helfen?
Vielen Dank für Ihre hilfreiche Antwort. Kannst du mir bitte, wenn möglich, helfen, die passende vma struct zu finden? Wie ich gesehen habe, gibt es in mm_strct einen rotschwarzen Baum namens mm_rb, der vma-Strukturen enthält. Wie greife ich auf mm_struct des Prozesses und wie suche ich in diesem Baum? –
Hallo, Dies wird gemacht von do_munmap() -> find_vma(), Sie können den Quellcode unter diesem Link ansehen. http://lxr.free-electronics.com/source/mm/mmap.c#L2411 – Lin