Großer gemeinsamer Speicher zwischen Kernel-Space und Benutzerbereich

8

Ich arbeite an einem Forschungsprojekt, und ich muss eine große Datenstruktur zwischen einem Kernel-Modul und einem Benutzer-Space-Programm teilen. Die Datenstruktur kann sehr groß werden, und da die Anwendung leistungskritisch ist, habe ich versucht, gemeinsam genutzten Speicher zu verwenden, um den Overhead der Serialisierung der Struktur (unter Verwendung anderer Schnittstellen wie NetLink) zu reduzieren. Ich habe derzeit einen Testcode basierend auf diesem Link erstellt:

[ Ссылка

Sie verwenden debugfs . Ich habe den Code im Link in mein Kernel-Modul eingefügt und ein benutzerdefiniertes Benutzer-Space-Programm geschrieben, das ihnen ähnlich ist. Ich habe es mit kleinen Größen meiner Datenstruktur versucht, die perfekt funktionierten. Sie können im Code bemerken, dass sie nur 1 Seite des Speichers teilen. Ich wollte wissen, ob es eine einfache Möglichkeit gibt, viel mehr Speicher als nur eine Seite zu teilen.

    
Aditya 17.06.2014, 21:57
quelle

1 Antwort

6

Es gibt nicht viele verschiedene Seiten.

Verteilen Sie mehr Seiten im offenen Bereich (alloc_pages oder eine Variante), speichern Sie diese in einem Array, dann muss Ihr Fehlerbehandler (basierend auf der fehlerhaften Adresse):

  • berechnen Sie den Offset in den Bereich mit etwas wie "(((ohne Vorzeichen lang) vmf- & gt; virtuelle_Adresse - vma- & gt; vm_start) + (vma- & gt; vm_pgoff & lt; & lt; PAGE_SHIFT)) "
  • dividiere durch PAGE_SIZE, um den Seitenindex innerhalb des Arrays zu berechnen
  • Bereichsüberprüfung, um sicherzustellen, dass sie gültig ist
  • pull struct page * aus dem Array
  • rufen Sie get_page auf, um das Mapping durchzuführen

Sie können weiterhin debugfs verwenden oder, mit einer kleinen Menge zusätzlicher Arbeit bei der Modulinitialisierung, ein einheitlicheres Zeichengeräte-Frontend darauf setzen. (Dazu muss sich wirklich nichts außerhalb der Module module_init / module_exit ändern.)

    
Gil Hamilton 18.06.2014, 12:44
quelle