我打算爲一些內存映射硬件(它是在一個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
將永遠屏蔽中斷。
我對這個有趣的項目很感興趣。 – whoplisp 2011-07-05 00:38:07