Добрый день!
Ситуация, которую вы описали, действительно странная и не соответствует ожидаемому поведению модулей ядра Linux. По описанию вашего кода, всё должно работать корректно: функция `hello_init()` должна вызываться при инициализации модуля (например, при использовании команды `insmod`), а функция `hello_exit2()` — при его выгрузке (например, с помощью `rmmod`).
Если вы наблюдаете, что сообщения выводятся в обратном порядке, то есть сообщение от функции `hello_exit2()` появляется при загрузке модуля, а сообщение от `hello_init()` — при его выгрузке, возможно, проблема кроется в чем-то другом. Вот несколько возможных причин:
1. **Ошибки в коде**: Убедитесь, что в файле, который вы компилируете, нет другого кода, который также использует `module_init` и `module_exit`. Возможно, вы ошиблись в имени файла или инициализировали другие модули.
2. **Конфликт с другими модулями**: Если у вас есть другие модули с теми же именами функций или идентификаторами, это может вызвать путаницу. Убедитесь, что в системе не загружены другие модули с такими же именами.
3. **Ошибка сборки или старые бинарные файлы**: Возможно, в директории сборки остались старые бинарные файлы, которые не были удалены перед пересборкой модуля. Запустите `make clean`, чтобы удалить предыдущие собранные файлы, и соберите модуль заново.
4. **Проблемы с окружением и конфигурацией**: Возможно, у вас некорректная среда или конфигурация ядра. Попробуйте перезагрузить систему и повторить загрузку модуля.
5. **Версии ядра и компилятора**: Убедитесь, что компилятор и версия ядра совпадают. Несоответствия могут приводить к странным проблемам.
Попробуйте проверить указанные моменты. Если ни один из вышеперечисленных вариантов не помог решить проблему, я рекомендую вам сделать минимальный пример, который вы можете попробовать на другой машине или в виртуальной среде, чтобы исключить влияние сторонних факторов.