簡體   English   中英

從內核空間執行用戶空間功能

[英]Executing a user-space function from the kernel space

我在Linux中編寫了一個自定義設備驅動程序,該驅動程序必須能夠非常快速地響應中斷。 在用戶空間實現中已經存在處理此問題的代碼,但是它太慢了,因為它依賴於軟件不斷檢查中斷線的狀態。 經過研究,我發現您可以從內核模塊注冊這些中斷線,並執行由函數指針提供的功能。 但是我們要執行的代碼是在用戶空間中,是否有一種方法可以從內核空間模塊中調用用戶空間中的函數?

從內核調用用戶空間函數很不走運,因為內核不知道,也不應該知道單個用戶空間應用程序的功能和邏輯,更不用說每個用戶空間應用程序都有自己的內存了。布局,不允許其他進程或內核以這種方式入侵(共享對象在這里是例外,但仍然不能從內核空間中利用該對象)。 關於安全模型,您不應該首先在內核上下文中運行用戶空間代碼(在內核上下文中自動被認為是不安全的代碼),因為這將破壞內核中的安全模型。那一瞬間。 現在考慮上述所有內容,再加上許多其他動機,您可能需要重新考慮您的方法,並專注於內核<->用戶空間IPC和接口 ,文件系統或用戶模式助手API(請參閱下面的內容)。

不過,您可以使用usermode-helper API從內核調用用戶空間應用程序。 以下IBM DeveloperWorks文章應該使您開始使用usermode-helper Linux內核API:

內核API,第1部分:從內核調用用戶空間應用程序

我認為最簡單的方法是注冊一個字符設備,該設備會在有一些數據時准備就緒。

任何嘗試從該設備讀取數據的過程都將進入睡眠狀態,直到設備准備就緒,然后將其喚醒,這時它可以執行相應的操作。

如果您只想表示准備就緒,則閱讀器可以只讀取一個空字節。

然后,用戶空間程序將只需要執行一個阻塞的read()調用,並且將被適當阻塞,直到將其喚醒為止。

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

聽起來您的中斷線已經可以通過gpiolib用於用戶空間? (/ sys / class / gpio / ...)

您是否對gpio邊緣觸發和poll()是否足夠快進行了基准測試? 這樣,您不必從用戶空間應用程序輪詢狀態,但是邊緣觸發將通過poll()報告狀態。 請參閱內核源代碼中的Documentation / gpio.txt。

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

我也面臨着同樣的問題,我閱讀了本文檔http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-6.html ,因此計划使用信號。 就我而言,沒有機會丟失信號,因為
1.系統是閉環的,信號執行后,只有我會得到另一個信號。
2.我正在使用POSIX實時信號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM