2016-06-10 6 views
2

Я занимаюсь разработкой модуля ядра графического процессора. Он компилируется только на «make modules», а не на «make», поэтому я могу сказать, что это динамически загруженный модуль, загружающий загрузку Linux. Я бы хотел быстро перекомпилировать и переустановить модуль без установки всего нового ядра. Можно ли просто «сделать модули», а затем заменить существующий файл .ko в/lib/modules/... и перезагрузить? Если нет (возможно, он используется), я могу загрузиться в другое ядро, выполнить замену и перезагрузить? Можно ли даже просто вставить его?Linux: перезагрузка модулей ядра

+0

Добро пожаловать в StackOverflow! Не могли бы вы рассказать о своем задаче, например, о коде или о чем-то, чтобы люди могли быстро решить вашу проблему и помочь вам? Благодаря! – manetsus

+1

manetsus, вопрос правильный, код «make modules». Scoob, да, вы можете сделать «make modules», заменить .ko вашего модуля, выгрузить его «rmmod module_name» (только если он не используется в настоящее время) и перезагрузить с помощью модуля modprobe module_name module_options'. – osgx

ответ

1

Он компилируется только на 'make modules', а не на 'make', поэтому я могу сказать, что это динамически загруженный модуль, загружающий загрузку Linux.

Вы должны проверить, где находится модуль. Он может храниться только в /lib/modules/...kernel-version../ или в/lib/modules и внутри initramfs (initrd). Во втором случае вам нужно восстановить изображение initramfs после обновления ko в/lib/modules.

Я хотел бы быстро перекомпилировать и переустановить модуль без установки совершенно нового ядра. Можно ли просто «сделать модули», а затем заменить существующий файл .ko в/lib/modules/... и перезагрузить?

Да, это разрешено изменять .ko-файл, даже если модуль загружен. (Загрузка модуля с помощью init_module осуществляется из копии in-memory файла .ko ELF, поэтому используемая версия модуля по-прежнему будет использовать старые данные).

При перезагрузке вы также не будете использовать все модули и их файлы.

Возможно ли это просто включить его?

Не допускается делать insmod модуля, который уже загружен (по сравнению с именем - проверить ошибки EEXIST в man finit_module). Вы можете попробовать загрузить его с другим именем, но старый модуль имеет право собственности на аппаратное обеспечение, а новый модуль не будет иметь доступа к устройству PCI/PCIe.

Итак, перед вставкой более новой версии вы должны выгрузить старый модуль на rmmod modulename. Разгрузка возможна только для неиспользуемых модулей (man delete_module, проверка счетчика использования в выводе lsmod) - в зависимости от вашего не должно быть других модулей, никакие процессы не должны его использовать. После выгрузки вы можете сделать insmod modulename.ko или modprobe modulename.ko.

Reboot выгрузит старый модуль и загрузит новый модуль.

В случае использования драйвера GPU вы должны остановить сервер X.org и остановить консоль системы, которая также использует графику (так что вы не можете переключиться на текстовую консоль и перезагрузить модуль gpu в интерактивном режиме, это можно сделать удаленно с помощью ssh или с помощью сценария оболочки с UNBIND/разгрузки/нагрузки), проверьте этот вопрос https://askubuntu.com/questions/418296/fastest-way-to-reload-graphics-driver-module

sudo /etc/init.d/lightdm stop 
echo 0 > /sys/class/vtconsole/vtcon1/bind 
Смежные вопросы