Hinweis zu den Unterschieden zwischen den beiden Zuweisungsmethoden kmalloc und kmem_cache oder vmalloc:
kmalloc: Am besten für schnelle Zuordnungen, die kleiner als eine Seite sind (PAGE_SIZE, 0x1000 auf den meisten Architekturen). Es beinhaltet keine Mapping-Speicher, also erhalten Sie den Speicher direkt aus dem 1: 1-physischen Speicher-Mapping des Kernels. Sie erhalten körperlich bedingte Erinnerung. Wenn Sie mehr als eine Seite zuweisen möchten (d. H. Auftrag & gt; 0), riskieren Sie, dass externe Fragmentierungsprobleme auftreten - d. H. Der Aufruf könnte fehlschlagen, selbst wenn genügend freie Daten vorhanden sind. Höhere Ordnung - höhere Chance für Zuteilungsfehler und Betriebszeit spielen auch hier eine Rolle.
Wenn Sie maximale Allokationseffizienz erreichen möchten, ist die Verwendung Ihres eigenen kmem_cache für jeden Struktyp der richtige Weg (die anderen Vorteile für diese Strategie bestehen darin, den Status Ihrer Zuweisungen von / proc zu überwachen und Speicherlecks zu erkennen leichter).
vmalloc: Zuweisungen von mehr als einer Seite. Sie erhalten mapped-memory im Kernel-Bereich. Hinter den Kulissen ähnelt es dem, was der Benutzer erhält - der Kernel weist eine Menge Seiten zu und bildet sie in einem virtuellen Adressraum ab. Diese Zuweisung ist langsamer als die von kmalloc, und Speicherzugriffe können etwas mehr Aufwand verursachen.
Sie können keine Bibliotheken im Kernel verwenden. Nichts wie auch immer.
Dies bedeutet, dass jede Funktion, die Sie im Kernel aufrufen, im Kernel definiert werden muss. Linux definiert kein malloc, daher können Sie es nicht verwenden.
Es gibt einen Speicherzuordner und eine Familie von Speicherzuweisungsfunktionen. Lesen Sie die Kernel-Dokumentation auf dem Speicherzuordner für weitere Informationen.
Nebenbei bemerkt gibt es einige Funktionen, die der Kernel definiert, die auch in der Standard-C-Bibliothek enthalten sind; Dies dient der Bequemlichkeit.
Es definiert zum Beispiel snprintf
Sie können es sich wie einen dreistufigen Prozess vorstellen:
Benutzerraumbibliothek - malloc ()
Systemaufruf - brk ()
Innerhalb des Kerns - kmalloc / vmalloc / gfp usw. Routinen des Speichermanagers
Wenn Sie also bereits in Schritt 3 das Kernel-Modul schreiben, macht ein Zurückgehen keinen Sinn. Sie müssen die Kernel-Routinen nur für die Speicherzuweisung verwenden.
Tags und Links linux linux-kernel unix