У меня есть довольно большой модуль драйвера, который я пытаюсь скомпилировать для последнего ядра 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 --
Однако очевидный ответ заключается в том, что модуль выделяет слишком много памяти :
Поэтому я подозреваю проблему с новым ядром, не связанную напрямую с ограниченной памятью.
Новое ядро жалуется на vmalloc()
размером 30 000 КБ, но со старым ядром lsmod дает мне размер 4 800 КБ.Должны ли эти цифры быть напрямую связаны? Возможно ли, что во время сборки что-то пошло не так и запрашивается слишком много оперативной памяти? Когда я компилирую размеры разделов обоих .ko
, я не вижу большой разницы.
Вот я и пытаюсь понять, откуда проблема. Когда я проверяю выгруженный стек, я не могу найти соответствующий фрагмент кода. Кажется, что ошибочный vmalloc()
сделан sys_init_module()
, который является init_module()
из kernel/module.c
. Но код не совпадает. Когда я проверяю код объекта из моего .ko
, код init_module()
также не совпадает.
Я более или менее заблокирован, так как я недостаточно хорошо знаю ядро, и вся система сборки и загрузка модулей довольно сложны для понимания. Ошибка возникает до загрузки модуля, так как я подозреваю, что некоторые функции отсутствуют, и insmod
не сообщает об этих ошибках на данный момент.