我一直在为真正奇怪的问题而烦恼。内核模块无法在没有 printk 的情况下向用户应用程序发送信号(或用户应用程序无法接收),必须在发送信号之后或之前执行虚拟 printk。
实际上,即使是空的 printk,它也能很好地工作。但是,我试图了解发生了什么。
有什么想法吗?
这是发生了什么:
A - 内核)字符设备类型模块获得中断。
它提取数据并向用户发送信号。
/* 必须在这里做 printk */
返回 IRQ 句柄。
B-用户)
接收信号。
发出系统调用并从 char 设备的缓冲区中读取数据。(copy_to_user)
核心:
void irq_handler(){
int i;
for(i =0; i < 32; i++)
GPIOdata[i] = read_gpio_status(i);
struct task_struct *p = find_task_by_pid(processinfo.pid);
if (NULL == p)
return;
send_sig(SIGUSR1, p, 0);
/* have to add printk here */
return IRQ_HANDLED
}
用户:
void signal_handler(int sig) {
char data[32];
ioctl(fd, READ_Data_from_Char_device, &data);
}