Welches ist der richtige Weg, um einen mit kmalloc zugewiesenen Puffer in einem User-Space-Prozess abzubilden? Vielleicht habe ich die Speicherzuordnung noch nicht verstanden... Ich schreibe ein Kernelmodul, das diesen Puffer (z.B. 120 Bytes) zuweist und ich würde ihn in einem User-Space-Prozess lesen und schreiben. Offensichtlich habe ich ein char-Gerät erstellt und ein mmap
Methode in der file_operations
Struktur. Meine Methode ist:
static int my_mmap(struct file *filp, struct vm_area_struct *vma)
{
//printk(KERN_INFO "Allocated virtual memory length = %d", vma->vm_end - vma->vm_start);
long unsigned int size = vma->vm_end - vma->vm_start;
if (remap_pfn_range(vma, vma->vm_start,
__pa(mem_area) >> PAGE_SHIFT, //what about vma->vm_pgoff?
size,
vma->vm_page_prot) < 0)
return -EAGAIN;
vma->vm_flags |= VM_LOCKED;
vma->vm_ops = &vmops;
vma->vm_flags |= VM_RESERVED;
my_vm_open(vma);
return 0;
}
wobei mem_area
zeigt auf einen Speicherbereich, der mit kmalloc
beim Modul init. Der Bereich wird mit dem gleichen Wert gefüllt (zum Beispiel 0x10). Alles funktioniert, aber ich denke, es ist etwas falsch in diesem Code:
-
kmalloc
könnte einen Zeiger zurückgeben, der nicht seitenorientiert ist, und in diesem Fall ist meiner Meinung nach der Wert des dritten Parameters vonremap_pfn_range
Tatsächlich habe ich im Benutzerbereich den falschen Wert gelesen. Stattdessen funktioniert alles, wenn ich__get_free_page
(weil die Funktion immer einen Zeiger zurückgibt, der seitenorientiert ist) oder wennkmalloc
gibt einen seitenausgerichteten Zeiger zurück. Die Speicherzuordnung funktioniert mit Speicherbereichen, die aus mehrerenPAGE_SIZE
Sollte ich also eine ganze Seite zuweisen, anstatt diekmalloc
? -
Wenn
my_mmap
aufgerufen wird, hat der Kernel bereits einige Seiten zugewiesen? Ich frage dies, weil ich einige Implementierungen von benutzerdefiniertenmmap
Methode, die den Aufrufremap_pfn_range
convma->vm_pgoff
als dritter Parameter...wie kann das sinnvoll sein? Ist dies die Kachel der ersten neu zugewiesenen Seite? Wenn ich als dritten Parameter eine Kachel übergebe, wie ich es inmy_mmap
Ich sollte die Seiten ab der ersten Seite freigeben.vma->vm_pgoff
? -
Ich habe jedoch eine Implementierung von
mmap
Methode, die einen Puffer abbildet, der mitkmalloc
. Um den Puffer korrekt zuzuordnen, wird eine Operation (die ich im Moment nicht verstehe) durchgeführt, bevorremap_pfn_range
. Angenommen, dassmem
ist der Zeiger, der vonkmalloc
,mem_area
wird auf diese Weise initialisiert:mem_area=(int *)(((unsigned long)mem + PAGE_SIZE - 1) & PAGE_MASK);
Así que mem_area
enthält den gleichen Wert von mem
nur wenn mem
ist seitenorientiert, da es sonst den Zeiger auf den Anfang der nächsten Seite enthalten sollte. Wenn ich jedoch bei dieser Operation als dritten Parameter von remap_pfn_range
der Wert __pa(mem_area) >> PAGE_SHIFT
Die Kartierung funktioniert gut. Warum?
Ich danke Ihnen allen!