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

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