2013-03-26 370 views
1

我將如何去實現我自己的文件描述符? 說如果我有一個內核模塊控制某些硬件,並且我想通過read()和write()將這個硬件與用戶空間進行通信的能力。不想使用IOCTL或netlink或其他用戶空間內核空間方法。我是否需要重新編譯內核,或者我可以通過編寫內核模塊來完成。我知道創建文件描述符將需要一個用戶空間機制來告訴內核空間在任務的文件結構中創建一個條目(即等效於open(),eventfd(),timerfd(),socket() )。我可以通過IOCTL實現(這樣我就不必重新編譯內核),但是我怎樣才能破解成read()和write() - 我已經用LD_PRELOAD補丁過了,是唯一的方法嗎?不想重新編譯內核!實現文件描述符

回答

0

我不知道我是否理解你的所有問題。儘管如此:

  • 你絕對可以擁有這個作爲內核模塊;
  • 你可能想要創建一個字符設備(問題的第二部分);
  • 對於char設備,您可以實現您需要的系統調用;如果你只想要有readwrite - 沒問題;

看看這book的第三章(和其他)。

0

konrad.kruczynski是對的!

使用字符設備作爲用戶空間機制與硬件進行通信,並在/ dev/hardware_type_A等/ dev文件系統中創建設備。

然後編譯& &加載模塊在內核中,那麼如果所有的代碼是好的,那麼內核將建立在/ dev目錄下的字符設備/用名/ dev/hardware_type_A。

然後,您可以像使用其他設備或文件來控制硬件一樣使用讀取,寫入,打開,關閉調用。

如果你真的說你不想通過ioctl來控制它,那麼你必須需要一個新的協議,使用寫入發送數據,並且驅動程序解包該數據並代表用戶的程序控制硬件。

+0

謝謝你的回答,@ konrad.kruczynski&John。目前字符設備/ ioctl是我實現用戶空間和內核空間之間通信的方式。我使用ioctl將指向數據結構的指針傳遞給KS,並且內核端模塊從該結構中提取數據。但事情是我需要一個在我可以使用select()的用戶空間中的實體。我需要一種方式在內核方發生事件時向美國發出信號。我知道還有其他的方式可以向美國發送信號,但美國可以用select()等待一些方法嗎?我可以使用select()和字符設備嗎? – lithiumhead 2013-04-02 04:51:14

+0

這真的可能由內核使用民意調查apis。參見linux/poll.h,當請求來自用戶空間時,將它添加到waitqueue中,並在來自驅動程序的數據中喚醒它。在內核源文件的drivers/char /文件夾中搜索wake_up_interruptible。這最終會通過減少等待中的CPU使用來改善您的驅動程序...... – John 2013-04-02 07:14:32