Gibt es eine Größenbeschränkung für das Kernelmodul in Linux?

8

Ich habe ein Problem beim Laden eines Kernel-Moduls, es gibt eine große Datenstruktur von etwa 2 GB Speicher - ob ich die Tabelle vorbelege (so dass es in .bss angezeigt wird, wenn ich size -A module.ko versuche oder vmalloc() es zum Ladezeitpunkt, das Laden des Moduls schlägt mit insmod: error inserting 'module.ko': -1 Cannot allocate memory fehl.

Ich habe versucht, das Problem auf usermode Linux zu debuggen, aber ich bekomme eine Reihe von segfaults (die in gdb fortgesetzt werden können, aber enden mit einer Konsolenmeldung overflow in relocation type 10 val <value in the ball park of 6G> und 'module' likely not compiled with -mcmodel=kernel . Ich nehme an, dass mit Kbuild der -mcmodel sollte richtig sein, oder?

Also sind die Fragen:

  1. Gibt es ein generisches 2G-Limit für die Größe des Linux-Kernel-Moduls?
  2. Gibt es ein spezifisches 2G-Limit für Kernel-Module in usernode linux (ich denke , dass ich in der Vergangenheit festgestellt habe, dass ein großes Kernel-Modul einen sauberen, kontinuierlichen Speicherblock benötigt ...)
  3. Kann ich -mcmodel=large für ein Kernelmodul angeben und erwarten, dass es funktioniert?

Ich habe dies auf debian Squeeze, 64-Bit, 2.6.32-5-amd64 (Host) mit 8 GB Speicher und 2.6.32 in UML mit 4G Speicher versucht, so sollte dies nicht ein normales Problem mit zu wenig Speicher sein.

Extra-Guthaben für das Limit umgehen, falls ein solches Limit besteht:)

    
Kimvais 10.06.2011, 12:13
quelle

3 Antworten

0

Wenn ich die Tabelle als static definiere - das Laden des Moduls wird in der Tat fehlschlagen - liegt das wahrscheinlich an der 1,5G Grenze, die in der Antwort von Andrew Aylett

Wenn ich jedoch dynamische vmalloc() -Aufrufe mache, konnte ich auf einem Host mit 8 GB Arbeitsspeicher bis zu 7680 MB aufspielen (bis der Kernel einige wichtige Prozesse beendete und mein X gehängt wurde).

Um meine Fragen zu beantworten:

  1. Ja, aber nur für Daten, die in static zusammengefasst sind
  2. Sieht nicht so aus.
  3. Das ist nicht nötig.

Extra-Guthaben: tun Sie einfach vmalloc()

Dies funktioniert nur in Linux-Kernel neuer als 2.6.10 - davor ist der vmalloc() Limit war 64 Mb.

    
Kimvais 14.06.2011, 07:07
quelle
7

Wie für Ihre erste Frage - das Limit für das Modul selbst ist 64 Megabyte. Der Modullader wird es ablehnen, ein Modul zu laden, das diese Größe überschreitet. Von kernel / module.c :

%Vor%

Das gilt sowohl für 2.6.32 als auch für die neueren Kernel, bis zu 3.3.

BEARBEITEN: In der Kernel-Version 3.4 ist das 64-MB-Limit wurde entfernt . Jetzt hängt das tatsächliche Limit nur davon ab, wie viel Speicher vmalloc() zuweisen kann.

    
Eugene 11.06.2011 04:33
quelle
1

Denken Sie daran, dass der Speicher des Kernelspeichers sich von dem Speicher des Benutzerspeichers unterscheidet - auf 32-Bit-Linux hat der Kernel nur 1 GB Adressraum. Unter 64-Bit-Linux gibt es einen Speicherplatz für mehr Adressraum für den Kernel, aber Kernel-Dokumentation schlägt vor, dass nur 1536 MB für Module verfügbar sind.

    
Andrew Aylett 10.06.2011 16:55
quelle