在linux中編寫自定義設備驅動程序,必須能夠在中斷時非常迅速地做出響應。處理這個問題的代碼已經存在於用戶空間的實現中,但是這太慢了,因爲它依賴軟件不斷檢查中斷線的狀態。在做了一些研究之後,我發現可以從內核模塊註冊這些中斷線,並執行由函數指針給出的函數。然而,我們想要執行的代碼位於用戶空間中,是否有方法從內核空間模塊調用用戶空間中的函數?從內核空間執行用戶空間函數
回答
由於內核沒有並且不應該知道單獨的用戶空間應用程序函數和邏輯,所以您對運行內核的用戶空間函數感到失望,更不用說每個用戶空間應用程序有它自己的內存佈局,沒有其他進程和內核被允許以這種方式入侵(共享對象在這裏是例外,但是你仍然無法從內核空間中進入)。關於安全模型,你不應該首先在內核上下文中運行用戶空間代碼(這在內核上下文中自動被認爲是不安全的代碼),因爲這會破壞內核的安全模型那一瞬間。現在考慮上面提到的所有內容,再加上許多其他動機,您可能需要重新考慮您的方法,並專注於內核< - >用戶空間IPC and Interfaces,文件系統或用戶模式助手API(請閱讀下文)。
您可以從內核調用用戶空間應用程序,但使用usermode-helper API。下面的IBM developerWorks文章應該讓你開始使用的用戶模式輔助Linux內核API:
Kernel APIs, Part 1: Invoking user-space applications from the kernel
聽起來像是你的中斷線路已經提供給用戶空間通過gpiolib? (/ sys/class/gpio/...)
如果gpio邊緣觸發和poll()足夠快,你有基準嗎?這樣您就不必輪詢用戶空間應用程序的狀態,但邊緣觸發將通過poll()報告它。在內核源代碼中查看Documentation/gpio.txt。
如果通過sysfs觸發的邊緣不夠好,那麼正確的方法是開發一個內核驅動程序,該驅動程序負責處理時間關鍵部分,並通過API(sysfs,設備節點等)將結果導出到用戶空間。 。
我認爲最簡單的方法是註冊一個字符設備,當設備有一些數據時就準備好了。
任何嘗試從此設備讀取的進程,然後進入休眠狀態,直到設備準備好,然後喚醒,然後可以執行相應的操作。
如果您只是想表示準備就緒,讀者可以讀取一個空字節。
用戶空間程序然後只需要執行一個阻塞的read()調用,並且會被適當地阻塞,直到你喚醒它爲止。
您需要了解內核調度程序的等待隊列機制才能使用它。
我也面臨同樣的問題,我讀了這個文件http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-6.html,所以打算用信號。在我的情況下,沒有丟失信號的機會,因爲
1.系統是閉環,信號執行後,只有我會得到另一個信號。
2.我正在使用POSIX實時信號。
- 1. Linux內核:從內核空間調用用戶空間的回調函數
- 2. 在用戶空間和內核空間上執行進程
- 3. Linux內核空間和用戶空間
- 4. 從內核空間執行ioctl
- 5. 從內核空間繞過數據包到用戶空間
- 6. 將數據從內核空間複製到用戶空間
- 7. 如何編寫由用戶空間函數調用的內核空間函數?
- 8. 從插座讀而不從內核空間到用戶空間
- 9. copy_from_user()在用戶空間或內核空間運行?
- 10. 如何回調從用戶空間保持到內核空間
- 11. 從內核空間傳遞地址到用戶空間
- 12. 從用戶級空間訪問內核空間中的變量
- 13. 如何從用戶空間訪問內核空間?
- 14. 從內核空間訪問用戶空間 - get_user_pages
- 15. 從用戶空間到內核空間的memcpy
- 16. 在Linux內核空間執行程序
- 17. 內核空間和用戶空間的時間差
- 18. 用戶空間和內核空間崩潰之間的區別
- 19. 內存分配內核空間和用戶空間進程
- 20. 何時將數據從內核空間讀取到用戶空間?
- 21. 從內核空間複製char *的二維數組到用戶空間?
- 22. 失去了一些參數從用戶空間到內核空間
- 23. 用內核觸發用戶空間
- 24. 將用戶空間代碼移植到內核空間
- 25. Netlink用戶空間和內核空間通信
- 26. 用戶空間vs內核空間驅動程序
- 27. Linux用戶空間和內核空間調度
- 28. 在內核空間和用戶空間中工作
- 29. 內核空間和用戶空間佈局
- 30. 從內核空間進行GPIO訪問
從內核調用用戶空間應用程序不推薦用於中斷處理。它只能用於非常特殊的情況。 – kauppi
@ kauppi - 你是對的,當我閱讀你的評論時,已經經歷了幾次噩夢般的場景,閃過我的眼睛......也許唯一的解決方案是將用戶空間代碼移植到內核代碼或集成相應的內核<->用戶空間的ipc /接口就可以實現用戶空間和內核空間的通信,如果前者不可行的話。 – Shinnok
從內核調用用戶空間代碼聽起來像是惡意軟件的最終攻擊媒介。 –