Frage

Ich habe ein Problem beim Laden eines Kernelmodul size -A module.ko oder versuchen vmalloc() Es schlägt zum Ladezeit den Modulladen fehl insmod: error inserting 'module.ko': -1 Cannot allocate memory.

Ich habe versucht, das Problem unter Usmode Linux zu debuggen, aber ich bekomme ein paar Segfaults (die in GDB fortgesetzt werden kann, aber am Ende eine Konsolennachricht overflow in relocation type 10 val <value in the ball park of 6G> und 'module' likely not compiled with -mcmodel=kernel. Ich nehme das an mit Kbuild das -mcmodel Sollte Recht haben, oder?

Die Fragen sind also:

  1. Gibt es eine generische 2G -Grenze für die Größe des Linux -Kernelmoduls?
  2. Gibt es eine bestimmte 2G -Grenze für Kernelmodule in Benutzernode Linux (i denken In der Vergangenheit habe ich bemerkt, dass ein großes Kernelmodul einen sauberen, kontinuierlichen Speicherblock benötigt ...)
  3. Kann ich angeben? -mcmodel=large für ein Kernelmodul und erwarten Sie, dass es funktioniert?

Ich habe dies bei Debian Squeeze, 64-Bit, 2,6,32-5-AMD64 (Host) mit 8 GB Speicher und 2,6,32 in UML mit 4G-Speicher ausprobiert, also sollte dies sollten nicht Seien Sie ein gewöhnliches Problem mit dem Gedächtnis.

Zusätzliches Guthaben für die Arbeit des Limits, wenn ein solches Limit existiert :)

War es hilfreich?

Lösung 3

Wenn ich die Tabelle definiere als static - Die Modulbelastung schlägt in der Tat fehl Andrew Aylett

Wenn ich jedoch dynamisch mache vmalloc() Anrufe, ich konnte auf einem Host mit 8 GB Speicher bis zu 7680 MB erreichen (bis der Kernel einen entscheidenden Prozess tötete und mein X hängt).

Um meine Fragen zu beantworten:

  1. Ja, aber nur für Daten, die in AS zusammengestellt werden static
  2. Sieht nicht so aus.
  3. Das ist nicht erforderlich.

Zusätzliche Gutschrift: Tu einfach vmalloc()

Dies funktioniert nur in Linux -Kerneln neuer als 2.6.10 - vorher die, die vmalloc() Die Grenze betrug 64 MB.

Andere Tipps

Was Ihre erste Frage betrifft - die Grenze des Moduls selbst beträgt 64 Megabyte. Der Modullader lehnt das Laden eines Moduls, das diese Größe überschreitet, ab. Aus kernel/modul.c:

if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL)
        return ERR_PTR(-ENOMEM);

Dies gilt sowohl für 2,6.32 als auch für die neueren Kernel bis zu 3,3.

Bearbeiten: In Kernel Version 3.4 das 64 -MB -Grenzwert wurde entfernt. Jetzt hängt die tatsächliche Grenze nur davon ab, wie viel Speicher vmalloc() kann zuweisen.

Denken Sie daran, dass sich der Kernel-Raum-Speicher vom Benutzer-Raum-Speicher unterscheidet-unter 32-Bit-Linux hat der Kernel nur 1 GB Adressraum. Es gibt ein Protokoll mehr Platz Adressraum für den Kernel unter 64-Bit-Linux, aber aber Kerneldokumentation schlägt vor, dass nur 1536 MB für Module verfügbar sind.

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