malloc im Kernel

8

Wenn ich versuche, malloc in einem Kernelmodul zu benutzen, erhalte ich eine Fehlermeldung vom Compiler. Mein Code:

%Vor%

Die Compiler-Fehlermeldung lautet:

%Vor%

Was soll ich tun?

    
yoavstr 22.05.2010, 14:22
quelle

6 Antworten

19

verwenden Sie kmalloc oder vmalloc stattdessen (siehe auch dies )

    
knittl 22.05.2010 14:31
quelle
14

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.

    
Dan Aloni 02.11.2011 22:40
quelle
7

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

    
MarkR 22.05.2010 22:29
quelle
1

verwende kmalloc / kfree. Sie können malloc im Kernel-Quellcode grep.

    
welfear 16.08.2011 16:31
quelle
0

In der Tat sollten Sie kmalloc und Freunde verwenden, überprüfen Sie den Linux-Kernel für Beispiele. z.B.: Ссылка

    
LIUB 28.12.2012 01:48
quelle
0

Sie können es sich wie einen dreistufigen Prozess vorstellen:

  1. Benutzerraumbibliothek - malloc ()

  2. Systemaufruf - brk ()

  3. 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.

    
Diwakar Sharma 23.04.2014 05:19
quelle

Tags und Links