2011-04-27 49 views
1

我打算爲一些內存映射硬件(它是在一個FPGA,所以我可以調整這兩個內存映射接口,如果需要)的Linux驅動程序。linux內核 - >用戶空間組播流數據報

該FPGA邏輯生成一系列數據報,我必須處理這些數據報,然後通過以太網鏈路進行傳輸。處理或網絡代碼沒有理由在內核中,所以我問的是將數據塊從硬件移動到用戶空間的「最佳」機制。最大的難題是用戶空間處理應該分佈在多個進程中。

數據速率不是很高(高達1Mbps),mmio接口由較深的FIFO(目前2KB,可能會增加高達8KB)饋送,所以我認爲高優先級的用戶模式過程可能會趕上。

我真的很喜歡的是一個指向現有的多播用戶空間接口的現有驅動程序(並沒有複雜的其他許多)。但是必須要做的概述將是一個合理的替代品。

我已經收集了以下想法而已:

  • AF_NETLINK:支持組播,需要照顧的緩衝對我來說。但API不穩定,我必須定義一個新的套接字ID,這可能與其他樹內驅動程序衝突,並且用戶模式界面非常專業化,我不能使用像socat這樣的標準工具來測試數據流。

  • 從用戶空間傳入數據報模式套接字或FIFO文件描述符並寫入(如何?)。有一個我可以應用的unix域數據報套接字多播補丁。

  • 將字符模式設備暴露給單個高優先級用戶模式應用程序,該應用程序充當unix域數據報套接字服務器並將數據報復制到每個連接的節點。是否爲字符模式設備保留數據報邊界(例如,如果我的驅動程序返回的字節數少於fread緩衝區大小,那麼fread是否將該數據塊作爲一個單元返回,或者是否可以分段和重新組合塊? read (2)代替fread (3)?有沒有像EMSGSIZE任何驅動程序的讀取功能,可以用它來表示一個數據報被截斷,或者是僅適用於插座?)

  • 揭露這可以通過打開一個字符模式設備同時存在多個用戶模式應用程序,並將數據緩存到每個內核中。

我傾向於使用unix域服務器重新路由傳入數據包的字符模式設備。這使我不必在內核驅動程序中實現緩衝邏輯。那麼問題就變成了如何在發生中斷時喚醒用戶進程或調用阻塞讀操作。看起來我的poll函數可以讀取控制寄存器,並且如果數據已經可用則返回POLLIN|POLLRDNORM,如果不是,則取消屏蔽中斷。然後中斷處理程序將使用wake_up來標記wait_queue已準備就緒。 read將永遠屏蔽中斷。

+0

我對這個有趣的項目很感興趣。 – whoplisp 2011-07-05 00:38:07

回答

1

我認爲字符驅動程序是一個更好的選擇,因爲你會發現更多的 文檔,內核部分更簡單。該API是衆所周知的,你會發現更多的人在字符驅動程序的經驗。

從小做起,即與工作interupt系封閱讀:

  • 如果沒有數據可用,隊列
  • 其他睡眠現有數據返回到用戶空間。

帶有中斷例程,如果數據可用,最終喚醒隊列。

一旦工作,實施民意調查。

+0

完成這樣做。能夠使用'hexdump','dd'和'socat'進行測試對於字符驅動程序而言,優先於netlink是一個很大的好處。 – 2011-05-19 04:03:28

2

我認爲netlink是你最好的選擇。順便說一句,你可以把一個netlink套接字當作一個普通套接字並使用POLL,EPOLL,選擇它。

此外,您的意思是「API不穩定」?Netlink使用了很多,它有一個相當不錯的API。

您只需使用通用netlink發送(並可能接收)消息。如果有單向通信,即從內核 - >用戶空間,您的任務變得更加容易。

編輯: 如果您有權限訪問,請參閱頁碼。 Wrox專業Linux內核體系結構的書810(第12章)。據我所知,它有一個(相對)很好的描述,你可以如何使用netlink與userland進行通信。

netlink的唯一缺陷是缺乏文檔。否則,我認爲沒關係。

+1

「API不穩定」我的意思是說,每當我找到一個例子,下面的評論都抱怨它不再適用於下一個內核版本。例如這使我認爲,任何已經足夠長的代碼都不能像書中一樣工作。 – 2011-04-27 21:11:08

1

使用字符設備選項,來自用戶空間的read(2)將最終調用您的驅動程序的read()函數(在您註冊設備的struct file_operations中指定)。因此,無論您是否維護數據報界限,以及在各種故障情況下想要返回哪些錯誤,都取決於您的實施。

相關問題