2012-08-24 86 views
0

我有一個Windows設備驅動程序,我想移植到Linux。Linux驅動程序 - 與用戶空間共享一個WaitHandle(-like)

我們的用戶空間應用程序通常需要等待驅動程序事件。下面是我們在Windows上使用的機制:

  1. 應用程序創建的WaitHandle
  2. 應用程序後,這WaitHandle的給司機通過ioctl
  3. 驅動程序可以使用ObReferenceObjectByHandle函數訪問該手柄和與KeSetEvent函數設置

我這個喜歡:

  • 的WaitHandle的CA n來自任何地方(可以是AutoReset或ManualReset,可以是.Net WaitHandle等)
  • 該進程不必使一個ioctl進入睡眠狀態,但可以調用通常的WaitForSingleObject。

我想在我的Linux驅動程序中保持相同的體系結構。

有誰知道我怎麼能在Linux上得到相同的行爲?

+0

您是否考慮過http://en.wikipedia.org/wiki/Netlink?我相信你應該重新設計你的Linux驅動程序,而不是將Windows驅動程序移植到Linux上! –

+0

這似乎有點過於複雜!我只想要一個等待隊列。實際上,98%的驅動程序是獨立於操作系統的C代碼,我需要從一個操作系統調整到另一個操作系統的幾個基本系統調用... – Julien

+0

然後,大部分代碼(例如您的等待隊列)位於用戶內部 - 空間守護進程。儘量減少內核部分! –

回答

1

一個簡單的想法是創建一個阻塞讀取的字符設備。用戶應用程序從設備讀取;這樣的讀取塊直到事件發生。

編輯:

另一個想法是send signal to userspace application,其處理程序將設置用戶空間等待句柄(futex的可能)。

+0

char設備不是同步原語,看起來像一個奇怪的想法:/。除此之外,我可能有多達30個這樣的事件(與通信管道相關),我不打算爲它們中的每一個創建一個字符設備... – Julien

+1

@Julien:另一個想法是發送信號到用戶空間應用程序(http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html#s6),其處理程序將設置用戶空間等待句柄(可能是futex)。 – Servateur

+0

可以發送事件(例如在Netlink上),每個事件都有不同的數據包。那麼你只需要一個字符設備,或一個網絡鏈接。你需要定義一個協議。 –

相關問題