Форум программистов, компьютерный форум, киберфорум
Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/23: Рейтинг темы: голосов - 23, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 12

Подключение модуля ядра

14.06.2012, 16:40. Показов 5063. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Необходимо подключить отдельно собранный модуль (usbserial) в рабочую систему. Исходники ядра на котором работает система идентичны исходникам в которых собирался модуль.

Собранный модуль usbserial.ko я скопировал в нужную папку, попробовал выполнить insmod usbserial.ko
вылезли ошибки подобно этой: Unknown symbol usb_serial_resume

Что не так делаю?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.06.2012, 16:40
Ответы с готовыми решениями:

Динамическое подключение модуля ядра
Доброго времени суток. Для выполнения лабораторной работы, необходимо подключить драйвер устройства командой kldload Нахожу устройство...

Разработка модуля ядра Linux
В Linux'е не шибко спец, однако есть такая задача: разработать модуль ядра... Вот, к примеру, простой hello world (NASM), однако как его...

Можно ли выводить сообщения при работе модуля ядра на консоль
можно ли как-нить выводить сообщения при работе модуля на консоль? Слышал, что это зависит от приоритетов... Но ни с одним приоритетом...

11
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.06.2012, 03:57
собери его там же
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 12
15.06.2012, 10:30  [ТС]
там же это где?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
16.06.2012, 06:30
там же, где подключаешь его
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 12
18.06.2012, 10:12  [ТС]
Дело в том, что linux я устанавливаю на встраиваемую систему. И собрать его там будет проблематично из-за малых ресурсов.
0
Заблокирован
18.06.2012, 11:02
Перед тем как инсертить модуль сделайте
Bash
1
echo 8 > /proc/sys/kernel/printk
и предоставьте полный вывод. Хотя скорее проблема в том, что это
Исходники ядра на котором работает система идентичны исходникам в которых собирался модуль
неверно и тогда нужно пользоваться modprobe'ом с флагом -f, если конечно ядро было скомпилировано с опцией CONFIG_MODULE_FORCE_LOAD. Но конечно для окончательно вердикта нужен подробный лог.

p.s. собирать модуль без разницы где, и перемещать .ko также нет необходимости если что
1
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 12
18.06.2012, 12:06  [ТС]
После выполнения команды
Bash
1
echo 8 > /proc/sys/kernel/printk
ничего не произошло. Попытался выполнить

Bash
1
2
3
4
5
6
7
8
9
#insmod usbserial.ko
option: Unknown symbol usb_serial_port_softint
option: Unknown symbol usb_serial_disconnect
option: Unknown symbol usb_serial_suspend
option: Unknown symbol usb_serial_probe
option: Unknown symbol usb_serial_register
option: Unknown symbol usb_serial_deregister
option: Unknown symbol usb_serial_resume
insmod: error inserting 'usbserial.ko': -1 Unknown symbol in module
Затем сделал так
Bash
1
2
# modprobe -f usbserial
FATAL: Error inserting usbserial (/lib/modules/2.6.30/kernel/drivers/usb/serial/usbserial.ko): Invalid module format
как видно результатов никаких
0
Заблокирован
18.06.2012, 15:12
Цитата Сообщение от benzopila Посмотреть сообщение
ничего не произошло
значит найдите способ, чтобы что-то произошло, а именно мне бы хотелось увидеть сообщения производимые pr_debug, которые в обилии присутствуют в sys_init_module и которых нет в вашем выводе

также надо скачать module-init-tools, который вы используете, и который слегка устарел, кстати говоря, и начать копать там
открываете modprobe.c сразу видим цепочку main->do_modprobe->handle_module->insmod
C
1
2
3
4
5
6
7
8
9
10
11
12
if (!list_empty(list)) {
        modprobe_flags_t f = flags;
        f &= ~mit_first_time;
        f &= ~mit_ignore_commands;
        if ((rc = insmod(list, "", "", conf, dirname, warn, f)) != 0)
        {
            error("Error inserting %s (%s): %s\n",
                mod->modname, mod->filename,
                insert_moderror(errno));
            goto out;
        }
    }
смотрим insert_moderror
C
1
2
3
4
5
6
7
8
9
10
11
12
13
static const char *insert_moderror(int err)
{
    switch (err) {
    case ENOEXEC:
        return "Invalid module format";
    case ENOENT:
        return "Unknown symbol in module, or unknown parameter (see dmesg)";
    case ENOSYS:
        return "Kernel does not have module support";
    default:
        return strerror(err);
    }
}
делаем вывод, что insmod вернул ENOEXEC, ищем что могло вернуть в нём ENOEXEC, у меня глаз сразу упал на init_module. Дальше, не имея сообщений ядра, можно впринципе лишь гадать почему мы получили ENOEXEC, потому что там довольно много условий, при которых мы можем получить такой результат, возможен такой например вариант:
init_module->load_module:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
modmagic = get_modinfo(sechdrs, infoindex, "vermagic");
        
        if (!modmagic) {
                err = try_to_force_load(mod, "bad vermagic");
                if (err)
                        goto free_hdr;
        } else if (!same_magic(modmagic, vermagic, versindex)) {
                printk(KERN_ERR "%s: version magic '%s' should be '%s'\n",
 
                       mod->name, modmagic, vermagic);
                err = -ENOEXEC;
                goto free_hdr;
        }
modprobe -f предусмотрительно зануляет vermagic, поэтому modmagic равен 0
C
1
2
if (flags & mit_strip_vermagic)
        clear_magic(module);
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void clear_magic(struct elf_file *module)
{
    struct string_table *tbl;
    int j;
 
    /* Old-style: __vermagic section */
    module->ops->strip_section(module, "__vermagic");
 
    /* New-style: in .modinfo section */
    tbl = module->ops->load_strings(module, ".modinfo", NULL);
    for (j = 0; tbl && j < tbl->cnt; j++) {
        const char *p = tbl->str[j];
        if (strstarts(p, "vermagic=")) {
            memset((char *)p, 0, strlen(p));
            return;
        }
    }
}
это нормальная ситуация и вызывается try_to_force_load, которая выглядит так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
static int try_to_force_load(struct module *mod, const char *reason)
{
#ifdef CONFIG_MODULE_FORCE_LOAD
        if (!test_taint(TAINT_FORCED_MODULE))
                printk(KERN_WARNING "%s: %s: kernel tainted.\n",
                       mod->name, reason);
        add_taint_module(mod, TAINT_FORCED_MODULE);
        return 0;
 
#else
        return -ENOEXEC;
#endif
}
и тут мы видим, что если ядро собрано без опции CONFIG_MODULE_FORCE_LOAD, что очень похоже на правду, потому что эта опция(как и многие другие впрочем) на встраиваемой системе бесполезна и просто сжирает драгоценные байты, то эта функция даже не будет пытаться ничего загружать, а просто опять вернёт ENOEXEC, ну и соответственно вердикт:
1) версии не совпадают
2) CONFIG_MODULE_FORCE_LOAD=n
чтобы подтвердить эту теорию нужно проверить CONFIG_MODULE_FORCE_LOAD

но в любом случае это всего лишь теория, чтобы сказать точнее нужны сообщения ядра
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
19.06.2012, 01:42
Цитата Сообщение от benzopila Посмотреть сообщение
Дело в том, что linux я устанавливаю на встраиваемую систему. И собрать его там будет проблематично из-за малых ресурсов.
что за "встраиваемая система", на которую устанавливается линукс ?
каких ресурсов не хватает для сборки модуля ?

Цитата Сообщение от benzopila Посмотреть сообщение
вылезли ошибки подобно этой: Unknown symbol usb_serial_resume
это похоже, что вызывается функция, которая недоступна

по крайней мере, при сборке он бы сказал, что ему не хватает
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 12
19.06.2012, 18:11  [ТС]
проверил, все таки CONFIG_MODULE_FORCE_LOAD=n

accept, плата at91sam9g45-ekes, не хватает места в памяти NandFlash
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.06.2012, 03:22
а в той системе, где собирал, он подключается и работает нормально ?

Добавлено через 14 минут
Цитата Сообщение от LosAngeles Посмотреть сообщение
C
1
#ifdef CONFIG_MODULE_FORCE_LOAD
да, похоже, в этом дело
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 12
13.07.2012, 12:06  [ТС]
В той системе другое ядро совсем, по-этому не пробовал.
Пересобрал ядро для встраиваемой системы с установленной опцией MODULE_FORCE_LOAD. Все заработало.
Теперь я попробовал подключить модули к ядру идущим в комплекте к встраиваемой системе. Ядро собирал той же версии и с теми патчами о которых говорится в документации к поставляемой системе. Так вот некоторые модули подключаются (usbserial, option), а некоторые нет (ppp_generic), пишет ту же ошибку Invalid module format.
Из-за чего так получается?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.07.2012, 12:06
Помогаю со студенческими работами здесь

Подключение ядра Linux
В общем препод дал задание, написать загрузчик и к нему же подключить ядро, естественно линукс так как с открытым исходным кодом и...

Подключение <Windows.h> в режиме ядра
Здравствуйте. При подключении DLL в режиме пользователя используется заголовочный файл &lt;windows.h&gt;. DLL подключается, всё работает....

Подключение модуля
Привет. Помогите разобраться. Добавила новый модуль, после этого программа перестала запускаться, выскакивает сообщение &quot;Класс не...

Подключение модуля.
добрый день. возникла потребность подключить модуль TDBF, установил, все ОК, но возникла проблема, КАК поставить компонент TDBF в...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru