LINUX.ORG.RU

Искажается информация о сигнале при прохождении оного из kernel 2.2 в user-space (Red Hat 6.2)


0

0

Имеется модуль ядра,kernel 2.2.14(RedHat 6.2)... По прерыванию из bottom-half обработчика прерывания посылается сигнал юзерскому процесу таким образом:

код: ... ... struct XXX_cbd { unsigned long signature; void (*isr)(void); struct sigaction sa; sigset_t mask; }; ... struct siginfo info; info.si_signo = dev->callback[channel].signo; info.si_errno = channel;info.si_code = SI_MESGQ;// must be < 0 for info.si_ptr info.si_pid = 0; /* sending from kernel */ info.si_uid = 0; info.si_ptr = dev->callback[channel].context; /* XXX_cbd struct*/ send_sig_info(info.si_signo, &info, dev->callback[channel].process);

---------------------------------------------------------------------

По приходу в юзерский обработччик:

код: static void XXX_signal_handler(int signo, siginfo_t * siginfo, void * arg) { if(signo == SIGUSR2 && siginfo->si_signo == SIGUSR2 && siginfo->si_code == SI_MESGQ && siginfo->si_pid == 0 && siginfo->si_uid == 0) { struct XXX_cbd * cptr = (struct DM6420HR_cbd *)siginfo->si_ptr; if(cptr->signature == magic_signature && cptr->isr != NULL) (*cptr->isr)(); } }

---------------------------------------------------------------------

Наблюдаются странные вещи: siginfo->si_code не равно SI_MESGQ а равно 0 siginfo->si_uid не равно 0 а равно к примеру C0A30000 а siginfo->si_ptr приходит вообще равным NULL вместо того что бы указывать куда надо...

В чём может быть дело? ЗЫ. В RedHat 7.3 ( kernel 2.4.18) всё работает правильно. Пытался посылать сигнал не из bottom-half обработчика(mark_bh(IMMEDIATE_BH) ) а также непосредственно из обработчика прерывания - результат тот же.

anonymous

запости то же самое, только перед нажатием на "post" выбери preformatted text

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