Запретить удаление занятого модуля ядра - PullRequest
0 голосов
/ 28 июня 2018

У меня есть простой модуль ядра, который создает символьные устройства и ничего с ним не делает.

Я написал эту программу пользовательского пространства, которая тестирует символьное устройство.

int main()
{
    int fd;

    fd = open("/dev/ebbchar", O_RDWR);
    if (fd < 0)
        err(1, "open");

    sleep(10);

    ret = close(fd);
    if (ret < 0)
        err(1, "close");
}

Программа завершается через 10 секунд.

Но если тем временем я удаляю модуль с помощью rmmod или modprobe, то через 10 секунд программа отключается или зависает, и ядро ​​перестает работать.

Как я могу вызвать сбой rmmod или есть способ безопасно удалить модуль?

Может ли мой модуль в своей функции __exit закрыть дескриптор файла?

Я предполагаю, что сбой вызван функцией close(), которая косвенно вызывает обратный вызов release в операциях с символьным файлом, причем эта функция release больше не существует, поскольку модуль был удален.

Источник модуля ядра можно найти здесь (поиск Листинг 2 ).

1 Ответ

0 голосов
/ 28 июня 2018

IIRC, вам нужно установить .owner = THIS_MODULE в структуре файловых операций, чтобы счетчик обращений модуля был обработан правильно.

...