Frage

Ich habe um gegoogelt und fand die meisten Menschen die Verwendung von kmalloc befürworten, wie Sie zusammenhängenden physikalischen Speicherblöcke zu bekommen sind garantiert. Allerdings scheint es auch, als ob kmalloc kann fehlschlagen, wenn ein zusammenhängender physischer Block, die Sie wollen, kann nicht gefunden werden.
Was sind die Vorteile der Verwendung eines zusammenhängenden Block von Speicher? Genauer gesagt, warum sollte ich brauche einen zusammenhängenden physischen habe Speicherblock in einem Systemaufruf ? Gibt es einen Grund, warum ich nicht nur vmalloc verwenden könnte?
Schließlich, wenn ich Speicher während der Bearbeitung eines Systemaufruf zuzuordnen waren, sollte ich GFP_ATOMIC angeben? Ist ein Systemaufruf in einem Atom Kontext ausgeführt?

  

GFP_ATOMIC
  Die Zuordnung ist mit hohen Priorität und   schläft nicht. Dies ist die Flagge zu   verwenden in Interrupt-Handler, unteren   Hälften und andere Situationen, in denen Sie   kann nicht schlafen.

     

GFP_KERNEL   Dies ist eine normale Verteilung und blockieren könnte. Dies ist die Flagge zu verwenden,   in Code Prozesskontext, wenn es sicher ist, zu schlafen.

War es hilfreich?

Lösung

Sie müssen nur über die Verwendung von physikalisch zusammenhängenden Speicher sorgen, wenn der Puffer von einem DMA-Gerät auf einem physikalisch adressierten Bus zugegriffen werden (wie PCI). Das Problem ist, dass viele Systemaufrufe haben keine Möglichkeit zu wissen, ob ihre Puffer wird schließlich zu einem DMA-Gerät übergeben werden: sobald Sie den Puffer auf einen anderen Kernel-Subsystem übergeben, kann man wirklich nicht wissen, wo es gehen wird. Auch wenn der Kernel nicht den Puffer für DMA nicht verwendet heute eine zukünftige Entwicklung könnte dies tun.

vmalloc ist oft langsamer als kmalloc, weil es den Pufferraum in einen praktisch zusammenhängenden Bereich kann neu zugeordnet werden. kmalloc nie remaps, aber wenn nicht mit GFP_ATOMIC kmalloc genannt blockieren kann.

kmalloc wird in der Größe des Puffers begrenzt kann es geben: 128 KBytes *) . Wenn Sie einen wirklich großen Puffer benötigen, haben Sie vmalloc oder einen anderen Mechanismus, wie die Reservierung hohe Speicher beim Booten verwenden.

  

*) Dies gilt für ältere Kernel. Auf den letzten Kernel (Getestet habe ich diese auf 2.6.33.2), max Größe eines einzelnen kmalloc ist bis zu 4 MB! (Ich schrieb ein ziemlich detaillierte Post zu diesem ) -. Kaiwan

Für ein System, rufen Sie brauchen nicht GFP_ATOMIC zu kmalloc () zu übergeben, können Sie GFP_KERNEL verwenden. Du bist kein Interrupt-Handler. Der Anwendungscode tritt in den Kernel-Kontext mittels einer Falle, es ist nicht ein Interrupt

Andere Tipps

Kurze Antwort:. Download Linux Device Drivers und das Kapitel über die Speicherverwaltung lesen

Im Ernst, es gibt eine Menge von subtilen Fragen im Zusammenhang Speicherverwaltung auf Kernel, die Sie verstehen müssen -. Ich habe viel von meiner Zeit Debuggen Problemen mit ihm verbringen

vmalloc () ist sehr selten verwendet, da der Kernel selten virtuelle Speicher verwendet. kmalloc () ist das, was üblicherweise verwendet wird, aber Sie müssen wissen, was die Auswirkungen der verschiedenen Flaggen sind und Sie brauchen eine Strategie für den Umgang mit dem, was passiert, wenn es nicht - vor allem, wenn Sie in einem Interrupt-Handler sind, wie Sie vorgeschlagen.

Linux Kernel Entwicklung von Robert Love (Kapitel 12, Seite 244 in 3. Auflage) beantwortet dies sehr deutlich.

Ja, physikalisch zusammenhängender Speicher ist in vielen Fällen nicht erforderlich. Hauptgrund für die kmalloc mehr als vmalloc im Kernel verwendet wird, ist die Performance. Das Buch erklärt, wenn große Speicher Chunks zugewiesen verwenden vmalloc, Kernel hat die physikalisch nicht zusammenhängende Abschnitte (Seiten) in einem einzigen zusammenhängenden virtuellen Speicherbereich abzubilden. Da der Speicher praktisch zusammenhängenden und physisch nicht zusammenhängende ist, mehrere virtuelle-zu-physikalische Adresszuordnungen werden auf die Seitentabelle hinzugefügt werden müssen. Und im schlimmsten Fall wird es (Größe des Puffer / Seitengröße) Anzahl der Zuordnungen auf die Seitentabelle hinzugefügt.

Dies fügt auch Druck auf TLB (die Cache-Einträge letzten virtuellen zu physischen Adresszuordnungen zu speichern), wenn diese Puffer zugreifen. Dies kann Dreschen führen.

Die kmalloc() & vmalloc() Funktionen sind eine einfache Schnittstelle für die Kernel-Speicher in Byte-Chunks zu erhalten.

  1. Die kmalloc() Funktion gewährleistet, dass die Seiten physisch benachbart sind (und praktisch zusammenhängende).

  2. Die vmalloc() Funktion arbeitet in ähnlicher Weise wie zu kmalloc(), außer es Speicher, der nur notwendigerweise praktisch zusammenhängende und nicht physisch zusammenhängend ist zuordnet.

Was sind die Vorteile der Verwendung eines zusammenhängenden Block von Speicher? Genauer gesagt, warum sollte ich brauche in einem Systemaufruf einen zusammenhängenden physikalischen Speicherblock haben? Gibt es einen Grund, warum ich nicht nur vmalloc verwenden könnte?

Von Googles "Ich glaube glückliche" auf vmalloc:

kmalloc ist der bevorzugte Weg, solange man nicht sehr große Flächen benötigen. Das Problem ist, wenn Sie DMA tun mögen, von / zu einem gewissen Hardware-Gerät, müssen Sie kmalloc verwenden, und Sie brauchen wahrscheinlich größere Brocken. Die Lösung ist der Speicher so schnell wie möglich zu verteilen, bevor Speicher wird fragmentiert.

auf einem 32-Bit-System, kmalloc () die Kernel-logische Adresse (seine eine virtuelle Adresse obwohl), welche die direkte Abbildung hat (tatsächlich mit konstantem Offset) in einem physikalischen Adresse. Diese direkte Zuordnung stellt sicher, dass wir ein zusammenhängendes physisches Stück RAM erhalten. Geeignet für DMA, wo wir nur den Anfangszeiger geben und erwarten, dass eine zusammenhängende physikalische Kartierung danach für unsere Operation.

vmalloc () gibt die virtuelle Kernel-Adresse, die wiederum möglicherweise nicht eine zusammenhängende Zuordnung auf physischen RAM aufweisen werden. Nützlich für große Speicherzuweisung und in Fällen, in denen wir, dass der Speicher in unseren Prozess auch in physischem RAM kontinuierlich zugeordnet nicht interessieren, ist.

Ein weiterer Unterschiede ist kmalloc kehrt logische Adresse (sonst Sie angeben GPF_HIGHMEM). Logische Adressen werden in „low-Speicher“ (in der ersten Gigabyte physischem Speicher) angeordnet und direkt auf physikalische Adressen abgebildet (Verwendung __pa Makro zu konvertieren). Diese Eigenschaft impliziert kmalloced Speicher kontinuierlich Speicher.

In anderer Seite ist vmalloc kann virtuelle Adressen von „high memory“ zurückzukehren. Diese Adressen können nicht in physikalischen Adressen in einer direkten Art und Weise umgewandelt werden (Sie haben virt_to_page Funktion verwenden).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top