malloc im kernel
Wenn ich versuche, mit malloc
in einem kernel-Modul bekomme ich eine Fehlermeldung vom compiler. Mein code:
res=(ListNode*)malloc(sizeof(ListNode));
Die Compiler-Fehlermeldung:
/root/ex3/ex3mod.c:491: error: implicit declaration of function ‘malloc’
Was soll ich tun?
- in anderen Worten, wie wir alle wissen #include <stdlib.h> nicht im kernel, was zählen sollte, die ich hatte ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
verwenden
kmalloc
odervmalloc
statt (siehe auch diese)vmalloc()
. Memory allocation funktioniert anders in den kernel.Hinweis über den Unterschied zwischen den beiden allocation-Methoden -
kmalloc
undkmem_cache
odervmalloc
:kmalloc
: Am besten geeignet für schnell-Zuweisungen, die sind kleiner als eine Seite (PAGE_SIZE, 0x1000 auf den meisten Architekturen). Es sich nicht um mapping-Speicher, so dass Sie den Speicher direkt aus dem kernel 1:1 physikalischer Speicher-mapping. Sie erhalten physikalisch bedingte Speicher. Beachten Sie, dass wenn Sie Sie zuweisen möchten mehr als einer Seite (D. H., um > 0), riskieren Sie, stoßen externe Fragmentierung, d.h. der Aufruf kann fehlschlagen, selbst wenn dort ist genug frei. Höhere Ordnung - höhere chance für die Zuteilung Versagen, und Zeit spielt hier ein Faktor zu.Wenn Sie wollen, um zu erreichen maximale Zuteilung Effizienz dann mit Ihrem eigenen
kmem_cache
für jede Art von Struktur ist der Weg zu gehen (die andere Vorteile dieser Strategie sind zu überwachen, den Zustand Ihrer Zuweisungen aus/proc
Fang und Speicher-Lecks leichter).vmalloc
: Zuweisungen von mehr als einer Seite. Sie erhalten mapped-Speicher im kernel-space. Hinter den kulissen ist es ähnlich zu dem, was userspace-bekommt - den-kernel weist ein Bündel von Seiten und ordnet Sie in einem virtuellen Adressraum. Diese Zuordnung ist langsamer alskmalloc
's, - und memory-Zugriffe entstehen können, ein bisschen mehr overhead.Können Sie nicht mit Bibliotheken in den kernel. Keine überhaupt.
Dies bedeutet, dass JEDE Funktion, die Sie aufrufen in der kernel muss auch definiert werden, in den kernel. Linux definiert nicht ein malloc, daher können Sie es nicht verwenden.
Es ist ein memory-allocator und eine Familie Speicherzuweisung Funktionen. Lesen Sie die kernel-docs auf der arbeitsspeicherzuweisung für weitere Informationen.
Incidentially, es gibt ein paar Funktionen, die der kernel definiert, die in der standard-C-Bibliothek als gut; dies ist für die Bequemlichkeit.
Tut es, zum Beispiel, definiert snprintf
verwenden kmalloc/kfree. Sie können grep malloc in kernel-source-code.
In der Tat, sollten Sie kmalloc und Freunden, überprüfen Sie den linux-kernel für die Beispiele. z.B.:
http://lxr.linux.no/linux+v3.0/drivers/infiniband/hw/mthca/mthca_provider.c#L1033
Können Sie sich vorstellen, dass es wie ein drei-Schritt-Prozess:
User-space-Bibliothek - malloc()
System call brk()
Innen-Kernel - kmalloc/vmalloc/gfp etc Routinen der Speicher-manager
Also, Wenn Sie bereits in Schritt 3, schreiben von kernel-Modul, dann zurück gehen, würde keinen Sinn machen. So müssen Sie die kernel-Routinen nur für die Speicherzuweisung.