Olej писал(а): ↑29 авг 2022, 00:09
Из инициализирующей функции proc_init() модуля нужно запускать отдельный поток ядра, а ему уже передавать функцию бесконечного цикла...
А в функции выгрузки модуля proc_exit() нужно корректно завершить этот отдельный поток!
1). Это совсем не такое простое дело...
2). Но интересное...
Поэтому 1) + 2) - сделал такой модуль.
P.S. Это вам как вариант ... Вы можете поэкспериментировать и сделать лучше.
Вот как это работает:
- Загрузка:
Код: Выделить всё
$ sudo insmod mod_loop.ko period=10
$ dmesg | tail -n4
[39765.110729] ! /proc/mod_loop directory created
[39765.110734] ! /proc/mod_loop/period created
[39765.111051] !! thread 26911l is running
[39765.111053] !! [4334434560] Hello fron module!
... я вместо from в выводе написал fron ... но это поправимо
Код: Выделить всё
$ cat /proc/mod_loop/period
10
$ dmesg | tail -n7
[39765.110734] ! /proc/mod_loop/period created
[39765.111051] !! thread 26911l is running
[39765.111053] !! [4334434560] Hello fron module!
[39775.606061] !! [4334445056] Hello fron module!
[39783.855500] ! return 2 bytes: <10>
[39783.855533] ! return EOF
[39785.845508] !! [4334455296] Hello fron module!
По меткам времени хорошо видно период 10 сек.
- Поменяли период на ходу:
Код: Выделить всё
$ echo 20 > /proc/mod_loop/period
$ cat /proc/mod_loop/period
20
$ dmesg | tail -n7
[39826.803296] !! [4334496256] Hello fron module!
[39828.006697] ! write: 2 bytes - 20
[39831.319768] ! return 2 bytes: <20>
[39831.319798] ! return EOF
[39837.042731] !! [4334506496] Hello fron module!
[39857.521630] !! [4334526976] Hello fron module!
[39878.000528] !! [4334547456] Hello fron module!
По меткам времени хорошо видно период 20 сек.
- Выключаем:
Код: Выделить всё
$ sudo rmmod mod_loop.ko0
$ dmesg | tail -n7
[39857.521630] !! [4334526976] Hello fron module!
[39878.000528] !! [4334547456] Hello fron module!
[39898.479410] !! [4334567936] Hello fron module!
[39918.958315] !! [4334588416] Hello fron module!
[39939.437194] !! [4334608896] thread 26911l finished
[39939.437225] ! [4334608896] child thread finished
[39939.437236] ! /proc/mod_loop/period removed
Хорошо видно:
- завершение рабочего потока...
- модуль
ожидает завершения потока - синхронизация по завершению...
- завершение происходит довольно долго - пока закончится текущий цикл потока...
- только после этого выгружается модуль.