我需要從內核發送一個字符串到用戶空間函數,而不用特別從用戶空間請求它,通過內核中的某個事件觸發用戶空間中的函數或應用程序。 到目前爲止,我已經嘗試了一個在用戶空間的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