我需要从内核发送一个字符串到用户空间函数,而不用特别从用户空间请求它,通过内核中的某个事件触发用户空间中的函数或应用程序。 到目前为止,我已经尝试了一个在用户空间的init上启动的Ioctl,然后睡觉并继续阅读关于netlink的内容,但找不到一个好的工作示例。 任何建议或例子都将非常有用。用内核触发用户空间
2
A
回答
4
这里是我的过程是如何工作的,我会感兴趣的改进以及任何建议:
- 启动内核模块
启动用户空间的应用程序,它发送一个自定义命令,以内核模块为内核模块信号注册用户空间PID。在我的情况下,这是通过写入/ dev/mymodule。内核模块注册PID:
... printk("registering a new process id to receive signals: %d\n", current->pid); signal_pid = current->pid; ...
用户空间应用程序还为特定类型的信号在内核中注册了一个处理程序。
void local_sig_handler(int signum) { printf("received a signal from my module\n"); fflush(stdout); } ... signal(SIGIO, local_sig_handler);
内核模块产生的信号
... struct siginfo info; struct task_struct *t; info.si_signo=SIGIO; info.si_int=1; info.si_code = SI_QUEUE; printk("<1>IRQ received: %d\n", irq); printk("<1>searching for task id: %d\n", signal_pid); t= pid_task(find_vpid(signal_pid),PIDTYPE_PID);//user_pid has been fetched successfully if(t == NULL){ printk("<1>no such pid, cannot send signal\n"); } else { printk("<1>found the task, sending signal\n"); send_sig_info(SIGIO, &info, t); }
内核中继信号到应用程序的处理程序
2
你有几种选择:
0
我以前用过的一个例子是从内核空间的硬件中断向用户空间发送信号。
核空间
你必须发送一个信号之前准备SIGINFO和task_struct的:
struct siginfo info;
struct task_struct *t;
info.si_signo = SIG_TEST;
info.si_code = SI_QUEUE;
info.si_int = 1234; // Any value you want to send
rcu_read_lock();
,也找到了与用户空间应用PID任务。您必须通过写或ioctl操作将它从用户空间发送到内核空间。
t = pid_task(find_pid_ns(pid, &init_pid_ns), PIDTYPE_PID);
然后你可以发送信号。
rcu_read_unlock();
send_sig_info(SIG_TEST, &info, t);
我在这里省略,但你必须检查每个操作的结果。
上面的代码准备信号结构并发送它。请记住,您需要应用程序的PID。在我的情况下,用户空间的应用程序通过ioctl驱动程序发送它的PID。
用户空间
你必须定义和实现回调函数:
void signalFunction(int n, siginfo_t *info, void *unused) {
.....
.....
}
在主要程序:
struct sigaction sig;
sig.sa_sigaction = signalFunction; // Callback function
sig.sa_flags = SA_SIGINFO;
sigaction(SIG_TEST, &sig, NULL);
我希望它能帮助。
相关问题
- 1. Linux内核空间和用户空间
- 2. Linux内核:从内核空间调用用户空间的回调函数
- 3. bsd内核用户空间事件kqueue
- 4. linux内核和用户地址空间
- 5. 内存分配内核空间和用户空间进程
- 6. 内核空间和用户空间的时间差
- 7. 用户空间和内核空间崩溃之间的区别
- 8. 内核如何通知用户空间程序发生中断
- 9. copy_from_user()在用户空间或内核空间运行?
- 10. 从插座读而不从内核空间到用户空间
- 11. 如何回调从用户空间保持到内核空间
- 12. 从内核空间传递地址到用户空间
- 13. 从用户级空间访问内核空间中的变量
- 14. 将用户空间代码移植到内核空间
- 15. 从内核空间绕过数据包到用户空间
- 16. 在用户空间和内核空间上执行进程
- 17. 如何从用户空间访问内核空间?
- 18. 从内核空间访问用户空间 - get_user_pages
- 19. 从内核空间执行用户空间函数
- 20. 将数据从内核空间复制到用户空间
- 21. Netlink用户空间和内核空间通信
- 22. 从用户空间到内核空间的memcpy
- 23. 用户空间vs内核空间驱动程序
- 24. Linux用户空间和内核空间调度
- 25. 在内核空间和用户空间中工作
- 26. 内核空间和用户空间布局
- 27. 用户空间和内核线程之间的共享内存
- 28. 是否术语“用户空间”和“内核空间”指的是物理内存?
- 29. 如何使用内核模块将内核空间中的结构写入用户空间中的文件?
- 30. 内核读取/写入用户空间内存
您不应该使用PID来识别内核中的进程。该过程可以退出并且不同的过程重新使用该PID。相反,你应该为进程使用指向'task_struct'的指针(而不是在注册时存储'current-> pid',只需存储'current')。 – caf