Подтвердить что ты не робот

Как удалить сбойный модуль ядра

Эта ситуация меня всегда беспокоит:

Я написал модуль ядра, и иногда он имеет ошибку (разыменовывает указатель NULL). После того, как я включил hello.ko, он показывает некоторые ошибки ядра. Затем я меняю код и пытаюсь удалить модуль и снова установить его. Вопрос в том, что я не знаю, как удалить модуль ядра.

$rmmod hello

ОШИБКА: используется модуль hello

$rmmod -f hello

ОШИБКА: удаление приветствия: занятость устройства или ресурса

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

4b9b3361

Ответ 1

Используйте виртуальную машину.

Как только вы сделаете NULL разыменование или другую такую ​​ошибку, вы поместили ядро ​​в неизвестное состояние. Даже если вам удастся удалить модуль (что вряд ли возможно, ядро ​​OOPS убивает вызывающий поток, поэтому у него никогда не будет возможности уменьшить счетчик ссылок - модуль никогда не будет съемным), все равно может быть коррупция осталась позади, и ваш новый, "фиксированный" модуль так же вероятно будет в беде.

Гораздо лучше просто использовать виртуальную машину с быстрой перезагрузкой - возможно, с моментальным снимком, чтобы сделать восстановление еще быстрее.

Ответ 2

Как отметил bdonlan, вам будет лучше с виртуальной машиной.

Однако, если вы действительно хотите сделать это по-своему, вам нужно:

  • убедитесь, что в конфигурации вашего ядра включен CONFIG_MODULE_FORCE_UNLOAD
  • напишите еще один модуль, который устанавливает refcount сломанного модуля в ноль. Проверьте системный вызов delete_module в kernel/module.c