Как удалить неисправный модуль ядра - PullRequest
18 голосов
/ 05 октября 2011

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

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

$ rmmod привет

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

$ rmmod -f привет

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

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

Ответы [ 2 ]

11 голосов
/ 05 октября 2011

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

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

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

3 голосов
/ 05 октября 2011

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

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

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