2011-03-09 63 views
4

在linux中編寫自定義設備驅動程序,必須能夠在中斷時非常迅速地做出響應。處理這個問題的代碼已經存在於用戶空間的實現中,但是這太慢了,因爲它依賴軟件不斷檢查中斷線的狀態。在做了一些研究之後,我發現可以從內核模塊註冊這些中斷線,並執行由函數指針給出的函數。然而,我們想要執行的代碼位於用戶空間中,是否有方法從內核空間模塊調用用戶空間中的函數?從內核空間執行用戶空間函數

回答

6

由於內核沒有並且不應該知道單獨的用戶空間應用程序函數和邏輯,所以您對運行內核的用戶空間函數感到失望,更不用說每個用戶空間應用程序有它自己的內存佈局,沒有其他進程和內核被允許以這種方式入侵(共享對象在這裏是例外,但是你仍然無法從內核空間中進入)。關於安全模型,你不應該首先在內核上下文中運行用戶空間代碼(這在內核上下文中自動被認爲是不安全的代碼),因爲這會破壞內核的安全模型那一瞬間。現在考慮上面提到的所有內容,再加上許多其他動機,您可能需要重新考慮您的方法,並專注於內核< - >用戶空間IPC and Interfaces,文件系統或用戶模式助手API(請閱讀下文)。

您可以從內核調用用戶空間應用程序,但使用usermode-helper API。下面的IBM developerWorks文章應該讓你開始使用的用戶模式輔助Linux內核API:

Kernel APIs, Part 1: Invoking user-space applications from the kernel

+1

從內核調用用戶空間應用程序不推薦用於中斷處理。它只能用於非常特殊的情況。 – kauppi

+0

@ kauppi - 你是對的,當我閱讀你的評論時,已經經歷了幾次噩夢般的場景,閃過我的眼睛......也許唯一的解決方案是將用戶空間代碼移植到內核代碼或集成相應的內核<->用戶空間的ipc /接口就可以實現用戶空間和內核空間的通信,如果前者不可行的話。 – Shinnok

+0

從內核調用用戶空間代碼聽起來像是惡意軟件的最終攻擊媒介。 –

2

聽起來像是你的中斷線路已經提供給用戶空間通過gpiolib? (/ sys/class/gpio/...)

如果gpio邊緣觸發和poll()足夠快,你有基準嗎?這樣您就不必輪詢用戶空間應用程序的狀態,但邊緣觸發將通過poll()報告它。在內核源代碼中查看Documentation/gpio.txt。

如果通過sysfs觸發的邊緣不夠好,那麼正確的方法是開發一個內核驅動程序,該驅動程序負責處理時間關鍵部分,並通過API(sysfs,設備節點等)將結果導出到用戶空間。 。

5

我認爲最簡單的方法是註冊一個字符設備,當設備有一些數據時就準備好了。

任何嘗試從此設備讀取的進程,然後進入休眠狀態,直到設備準備好,然後喚醒,然後可以執行相應的操作。

如果您只是想表示準備就緒,讀者可以讀取一個空字節。

用戶空間程序然後只需要執行一個阻塞的read()調用,並且會被適當地阻塞,直到你喚醒它爲止。

您需要了解內核調度程序的等待隊列機制才能使用它。

相關問題