#linux-kernel
#linux-ядро
Вопрос:
Эта ситуация всегда меня беспокоит:
Я написал модуль ядра, и иногда в нем есть ошибка (разыменование нулевого указателя). После того, как я изменил hello.ko, он показывает некоторые ошибки ядра. Затем я изменяю код и пытаюсь удалить модуль и установить его снова. Вопрос в том, что я не знаю, как удалить модуль ядра.
$ rmmod привет
ОШИБКА: используется модуль hello
$ rmmod -f привет
ОШИБКА: удаление привет: устройство или ресурс заняты
Я всегда перезагружаю компьютер, чтобы удалить модуль, что занимает слишком много времени. У кого-нибудь есть лучшее решение для этого? Спасибо за любые входные данные.
Ответ №1:
Используйте виртуальную машину.
Как только вы совершаете разыменование NULL или другую подобную ошибку, вы переводите ядро в неизвестное состояние. Даже если вам удалось удалить модуль (что вряд ли возможно; сбой ядра убивает вызывающий поток, поэтому у него никогда не будет возможности уменьшить количество ссылок — модуль никогда не будет удален), все равно может остаться повреждение, и ваш новый, «исправленный»модуль с такой же вероятностью может быть в беде.
Гораздо лучше просто использовать виртуальную машину с быстрой перезагрузкой — возможно, с моментальным снимком, чтобы сделать восстановление еще быстрее.
Ответ №2:
Как указал bdonlan, вам было бы лучше с виртуальной машиной.
Однако, если вы действительно хотите сделать это по-своему, вы должны:
- убедитесь, что в вашей конфигурации ядра включена функция CONFIG_MODULE_FORCE_UNLOAD
- напишите другой модуль, который устанавливает refcount поврежденного модуля равным нулю. Проверьте
delete_module
системный вызов вkernel/module.c
Ответ №3:
Количество ссылок или значение в столбце Used by (см. lsmod
) для моего случая было равно -1. Это значение также можно найти по адресу /sys/module/<kernel_module>/refcnt
.
Вот ответ, который я нашел, который сработал для меня здесь: https://askubuntu.com/a/521231
echo -e "blacklist kernel_modulen" | sudo tee -a /etc/modprobe.d/blacklist.conf
Затем вам нужно перезагрузить компьютер. Повторно скомпилируйте чистую стабильную версию вашего модуля. Затем введите следующую команду, чтобы перезагрузить и перезаписать сбойный модуль.
insmod kernel_module.ko
Сначала,
rmmod kernel_module