Есть ли ограничение размера для модуля ядра в Linux? - PullRequest
8 голосов
/ 10 июня 2011

У меня проблема с загрузкой модуля ядра, существует большая структура данных, размером около 2 ГБ памяти - я предварительно выделяю таблицу (чтобы она отображалась в .bss, когда я делаю size -A module.ko или пытаюсь vmalloc() это во время загрузки, загрузка модуля завершается неудачно с insmod: error inserting 'module.ko': -1 Cannot allocate memory.

Я попытался отладить проблему на usermode linux, но я получаю кучу ошибок (это можно продолжить в gdb, но в итогеконсольное сообщение overflow in relocation type 10 val <value in the ball park of 6G> и 'module' likely not compiled with -mcmodel=kernel. Я предполагаю, что с Kbuild значение -mcmodel должно быть правильным, верно?

Итак, вопросы:

  1. Есть лиобщий предел 2G для размера модуля ядра Linux?
  2. Существует ли конкретный предел 2G для модулей ядра в linux usernode (я думаю , что в прошлом я заметил, что большой модуль ядра нуждается вчистый, непрерывный блок памяти ...)
  3. Можно ли указать -mcmodel=large для модуля ядра и ожидать, что он будет работать?

Я пробовал это на debian squeeze, 64-битная, 2.6.32-5-amd64 (хост) с 8 ГБ памяти и 2.6.32в UML с памятью 4G, поэтому , а не должно быть обычной проблемой нехватки памяти.

Дополнительный кредит для работы вокруг предела, если такой предел существует:)

Ответы [ 3 ]

7 голосов
/ 11 июня 2011

Что касается вашего первого вопроса - ограничение на сам модуль составляет 64 мегабайта.Загрузчик модулей отклонит загрузку модуля, который превышает этот размер.От kernel / module.c :

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

Это верно как для 2.6.32, так и для более новых ядер, вплоть до 3.3.

РЕДАКТИРОВАТЬ: Вверсия ядра 3.4, ограничение 64 МБ было удалено .Теперь фактический предел зависит только от того, сколько памяти vmalloc() может выделить.

1 голос
/ 10 июня 2011

Помните, что память пространства ядра отличается от памяти пространства пользователя - в 32-битном Linux ядро ​​имеет только адресное пространство 1 Гб. В 64-битном Linux ядро ​​содержит больше пространства адресов для ядра, но документация по ядру предполагает, что для модулей доступно только 1536 МБ.

0 голосов
/ 14 июня 2011

Если я определю таблицу как static - загрузка модуля действительно не удастся - это, вероятно, из-за предела 1,5 ГБ, упомянутого в ответе Эндрю Айлетт

Однако, если я выполняю динамические vmalloc() вызовы, я смог получить до 7680 МБ на хосте с 8 ГБ памяти (до тех пор, пока ядро ​​не убило какой-то важный процесс и мой X не завис).

Итак, чтобы ответить на мои вопросы:

  1. Да, но только для данных, скомпилированных как static
  2. Не похоже на это.
  3. Нет необходимости делать это.

Дополнительный кредит: просто сделайте vmalloc()

Это работает только в ядрах Linux новее, чем 2.6.10 - до этого ограничение vmalloc() было 64 Мб.

...