11 Stimmen

mmap: Abbildung eines mit kmalloc zugewiesenen Kernelpuffers im Benutzerbereich

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:

  1. kmalloc könnte einen Zeiger zurückgeben, der nicht seitenorientiert ist, und in diesem Fall ist meiner Meinung nach der Wert des dritten Parameters von remap_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 wenn kmalloc gibt einen seitenausgerichteten Zeiger zurück. Die Speicherzuordnung funktioniert mit Speicherbereichen, die aus mehreren PAGE_SIZE Sollte ich also eine ganze Seite zuweisen, anstatt die kmalloc ?

  2. Wenn my_mmap aufgerufen wird, hat der Kernel bereits einige Seiten zugewiesen? Ich frage dies, weil ich einige Implementierungen von benutzerdefinierten mmap Methode, die den Aufruf remap_pfn_range con vma->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 in my_mmap Ich sollte die Seiten ab der ersten Seite freigeben. vma->vm_pgoff ?

  3. Ich habe jedoch eine Implementierung von mmap Methode, die einen Puffer abbildet, der mit kmalloc . Um den Puffer korrekt zuzuordnen, wird eine Operation (die ich im Moment nicht verstehe) durchgeführt, bevor remap_pfn_range . Angenommen, dass mem ist der Zeiger, der von kmalloc , 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!

6voto

caf Punkte 224189
  1. Ja, Sie sollten eine ganze Anzahl von Seiten zuweisen.

  2. Nein, der Kernel hat keine Seiten zugewiesen. vm->vm_pgoff ist der angeforderte Offset innerhalb des zuzuordnenden Geräts - er ist der letzte Parameter des Userspace mmap() Aufruf, übersetzt von Bytes in Seiten. Sie sehen sich wahrscheinlich die mem o kmem mmap-Implementierungen, bei denen der Offset die physische oder lineare Seite darstellt, die der Userspace abbilden will.

  3. Das ist einfach die Zuweisung eines seitenausgerichteten Puffers innerhalb der kmalloc() zugewiesenen Puffer. Besser ist es, wenn Sie __get_free_pages() wie Sie bereits vermutet haben, die Ausschaltung des Mittelsmannes.

Sie sollten prüfen, ob die Größe, die abgebildet wird, Ihren Puffer nicht übersteigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X