Перенос модуля на новое ядро ​​Linux :Не удается выделить память

У меня есть довольно большой модуль драйвера, который я пытаюсь скомпилировать для последнего ядра Linux (3.4.4 ). Я могу успешно скомпилировать и insmodтот же модуль с ядром 2.6.27.25. Версия GCC тоже отличается, 4.7.0 против 4.3.0. Обратите внимание, что этот модуль довольно сложен, и я не могу просто просмотреть весь код и все make-файлы.

При «вставке» модуля я получаю Cannot allocate memoryсо следующими трассами:

vmap allocation for size 30248960 failed: use vmalloc=<size> to increase size.
vmalloc: allocation failure: 30243566 bytes
insmod: page allocation failure: order:0, mode:0xd2
Pid: 5840, comm: insmod Tainted: G           O 3.4.4-5.fc17.i686 #1
Call Trace:
 [<c092702a>] ? printk+0x2d/0x2f
 [<c04eff8d>] warn_alloc_failed+0xad/0xf0
 [<c05178d9>] __vmalloc_node_range+0x169/0x1d0
 [<c0517994>] __vmalloc_node+0x54/0x60
 [<c0490825>] ? sys_init_module+0x65/0x1d80
 [<c0517a60>] vmalloc+0x30/0x40
 [<c0490825>] ? sys_init_module+0x65/0x1d80
 [<c0490825>] sys_init_module+0x65/0x1d80
 [<c050cda6>] ? handle_mm_fault+0xf6/0x1d0
 [<c0932b30>] ? spurious_fault+0xae/0xae
 [<c0932ce7>] ? do_page_fault+0x1b7/0x450
 [<c093665f>] sysenter_do_call+0x12/0x28
-- clip --

Однако очевидный ответ заключается в том, что модуль выделяет слишком много памяти :

  • . У меня нет проблем со старой версией ядра, какого бы размера ни был этот модуль
  • если я урежу какую-то часть этого модуля, чтобы получить гораздо меньшее потребление памяти, я всегда буду получать одно и то же сообщение об ошибке с новым ядром
  • Я могу выгрузить множество других модулей, но это никак не влияет (и вообще актуально? существует ли глобальный предел для Linux в отношении общего использования памяти модулями)

Поэтому я подозреваю проблему с новым ядром, не связанную напрямую с ограниченной памятью.

Новое ядро ​​жалуется на vmalloc()размером 30 000 КБ, но со старым ядром lsmod дает мне размер 4 800 КБ.Должны ли эти цифры быть напрямую связаны? Возможно ли, что во время сборки что-то пошло не так и запрашивается слишком много оперативной памяти? Когда я компилирую размеры разделов обоих .ko, я не вижу большой разницы.

Вот я и пытаюсь понять, откуда проблема. Когда я проверяю выгруженный стек, я не могу найти соответствующий фрагмент кода. Кажется, что ошибочный vmalloc()сделан sys_init_module(), который является init_module()из kernel/module.c. Но код не совпадает. Когда я проверяю код объекта из моего .ko, код init_module()также не совпадает.

Я более или менее заблокирован, так как я недостаточно хорошо знаю ядро, и вся система сборки и загрузка модулей довольно сложны для понимания. Ошибка возникает до загрузки модуля, так как я подозреваю, что некоторые функции отсутствуют, и insmodне сообщает об этих ошибках на данный момент.

5
задан Shahbaz 19 July 2012 в 12:33
поделиться