LINUX.ORG.RU

[KERNEL] От завершения потока, падает ядро.

 


0

0

Добрый день, столкнулся вот с такой проблемой, и никак не могу её решить.

Мой модуль создаёт поток ядра, который как мне кажется работает корректно. Мне так кажется, изза того, что если его создать в функции инициализации модуля, то он работает корректно и никаких ошибок нет. И при окончании работы потока через do_exit(1) , поток завершает свою работу и всё хорошо.

А вот если в модуле создать ещё какую-то функцию, и уже в ней создать точно такойже поток ядра(который я описал выше) то поток создастся, и отработает корректно, да вот беда, в таком случаи..когда код дойдёт до do_exit(1) , произойдёт паника ядра, - просто система намертво повиснет.

В чём дело? куда смотреть? почему такое происходит?..может кто-то сталкивался с такойже проблемой.

Поток создаю через kernel_thread(tcp_cli, NULL, 0);

Deleted

Ответ на: комментарий от frey

Например так.

/* Фнкция создающая некий поток */

void new_func( void )

{

/* Просто создаём новый поток */

kernel_thread(tcp_thread, NULL, 0); return;

}

/* Функция - поток */

int tcp_thread(void *arg)

{ /* какие-то действия */

do_exit(1);

}

/* Функция инициализации модуля, короче первая исполняемая функ. */

int module_init()

{ /* Если тут создать поток, вот так */

kernel_thread(tcp_thread, NULL, 0);

/* То поток корректно отработает и завершится */

/* А если создать поток вот так (вызвав отдельную ф-цию которая создаёт поток)*/

new_func();

/* То поток создастся , нормально отработает но когда дойдёт до завершения, тоесть до do_exit(1); Произойдёт зависание системы. */

}

module_init(module_init);

module_exit(module_cleanup)

Почему такое происходит? как этого избежать?

Deleted
()
Ответ на: комментарий от Deleted

могу чето не понимать, но do_exit() завершает основной поток, функция должна иметь свою точку выхода. Видимо у тебя ошибка в стеке возникает. Попробуй посмотреть кору отладчиком.

Lee_Noox ★★★
()

> Мой модуль создаёт поток ядра,

нет, не создает ;) я уже писал (вам?), что нужно пользоваться
kthread_create().

kernel_thread() в контексте module_init() это просто неправильно
по многим причинам. созданная задача не будет kernel thread.

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

паника ядра, - просто система намертво повиснет.


так паника или наглухо виснет?

idle ★★★★★
()
Ответ на: комментарий от idle

Lee_Noox

Посмотреть кору отладчиком не получится, он не создаётся. ( если я думаю о правильных вещах )

могу чето не понимать, но do_exit() завершает основной поток, функция должна иметь свою точку выхода.

Что посоветуете мне попробовать?

idle

так паника или наглухо виснет?

Наглухо виснет =)

нет, не создает ;) я уже писал (вам?)

Мне =)

kernel_thread() в контексте module_init() это просто неправильно
по многим причинам. созданная задача не будет kernel thread.

А какая тогда получается задача если не поток? И почему вроде как задание работает при создании его в module_init() ?? ( кстати, это задание, продолжает работу и после вызова module_cleanup(); )

И уж совсем тупой мой вопрос )).. Как правильно вызвать kthread_create() ?

покажите минимальный код, который демонстрирует проблему?

Минимальный код приведён сверху. После долгих (очень долгих) проб и ошибок, было обнаружено, что код того что я называю потоком, никак не влияет на работу модуля. А вот то, где вызвать kernel_thread (в некой функции или в функции module_init() ) очень даже влияет на работу.

Если не сложно, приведите простенький пример кода с вызовом kthread_create() , я попробую по нему свой код переписать, и отпишусь о результатах.

Deleted
()
Ответ на: комментарий от Deleted

емнип при сборке ядра мжно указать опции отладки при этом кора будет нормально падать на винт и далее по списку.

Lee_Noox ★★★
()
Ответ на: комментарий от Deleted

> > нет, не создает ;) я уже писал (вам?)



Мне =)



так чего же вы ;)

А какая тогда получается задача если не поток?


ох. kernel_thread() это (почти) просто clone(CLONE_VM). в вашем
случае выполняется в контексте /sbin/insmod и все наследует.
это никак не kernel thread.

И почему вроде как задание работает при создании его в

module_init()??



и что? конечно, оно работает.

( кстати, это задание, продолжает работу и после вызова

module_cleanup(); )



это может обьяснить hang. после rmmod вся память (в тч и код
tcp_thread() b все-все-все) освобождается.

Минимальный код приведён сверху.


не морочьте мне голову ;) код, конечно, неправильный. но,
держу пари, воспроизвести пробдему не сможет. он, вообще,
компилируется?

Если не сложно, приведите простенький пример кода с вызовом

kthread_create()



ну, это наглость ;) пишите kernel module и вам лень погуглить
или просто запустить grep! да и какой тут вообще нужен пример???



idle ★★★★★
()
Ответ на: комментарий от x905

> http://www.scs.ch/~frey/linux/kernelthreads.html

не надо так делать. это все сильно устарело и не нужно.
да и не скомпилируется.

в данном контексте, обратите внимание, что kernel_thread()
не вызывается напрямую.

idle ★★★★★
()
Ответ на: комментарий от idle

idle ОГРОМНОЕ СПАСИБО за ответы )

Пишу это сообщение, т.к. не хочу чтоб думали , что я такая скотина, что даже не поблагодарил. Пока ничего не отписывал, так как несколько дней занимался другими вещами, не связанными с программированием (учёба). Сегодня днём посижу над этим kernel_thread() , посмотрю исходники, постараюсь понять как это всё работает, и естественно попробую нормальные потоки в своём модуле создавать. Естественно предвижу, что сегодня ещё вопросы появятся)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.