如何解决pid_task() 导致内核崩溃,Linux 内核 5.4
我正在尝试从内核空间向用户空间发送信号。 我有以下代码,但我看到内核崩溃。
[ 5230.132362] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: prog_irq_handler+0x1d4/0x2cc [prog_mon]
[ 5230.146795] ---[ end Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: prog_irq_handler+0x1d4/0x2cc
经过进一步调试,我发现恐慌的根源来自以下函数:
t = pid_task(find_pid_ns(id,&init_pid_ns),PIDTYPE_PID);
引用“t”的值似乎会导致异常,导致内核崩溃。
内核 5.4 是否存在与 pid_task() 相关的已知问题。 任何帮助将不胜感激。
我的内核来自 yocto,它是:
分支 ti-linux-5.4.y
提交 6f3bf13d53820fc12432d7052744be2ee046fc92 (HEAD -> ti-linux-5.4.y) 合并:d2f658ed506d d5ef1ab82339 作者:LCPD Auto Merger lcpd_integration@list.ti.com 日期:2020 年 4 月 3 日星期五 10:50:48 -0500
https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/
完整代码如下:
send_signal(int val,int id,int sig)
{
struct kernel_siginfo info;
struct task_struct *t;
int ret;
ret = 0;
if ((id > 0) && (sig > 0)) {
memset(&info,sizeof(struct siginfo));
info.si_signo = sig;
/* Using SI_KERNEL here results in real_time data not getting delivered to the user space signal handler */
info.si_code = SI_QUEUE;
/* Real time signals may have 32 bits of data */
info.si_int = val;
info._sifields._rt._sigval.sival_int = val;
info.si_errno = 0;
rcu_read_lock();
t = pid_task(find_pid_ns(id,PIDTYPE_PID);
if(t == NULL) {
printk(KERN_ERR "%s: Invalid user handler PID %d\n",module_name,id);
rcu_read_unlock();
return -ENODEV;
}
ret = send_sig_info(sig,&info,t);
rcu_read_unlock();
if (ret < 0)
printk(KERN_INFO "%s: Failed to signal with data %d to user space\n",val);
}
return ret
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。