我想在用戶和內核空間之間構造兩個共享隊列(一個命令隊列和一個回覆隊列)。這樣內核就可以向用戶空間發送消息,用戶空間在完成處理後可以向內核發送回覆。我所做的是使用爲用戶空間分配內核內存頁面(用於隊列)和mmap,現在用戶和內核都可以訪問這些頁面(這裏我指的是在內核空間中寫入的內容可以正確讀取在用戶空間中,或反之亦然)。內核/用戶地址空間之間共享的無鎖隊列
問題是我不知道如何在內核和用戶空間之間同步訪問。假設我要爲多製造商1用戶方案構建環形緩衝區,那麼如何使這些環形緩衝區訪問不會被同時寫入損壞?
本週我做了一些研究,這裏有一些可能的方法,但我在內核模塊開發方面頗爲新穎,不太確定它是否可行。當挖掘到他們,我會很高興,如果我能得到的任何意見或建議:用戶/內核空間之間
使用共享信號:Shared semaphore between user and kernel spaces
但許多系統調用像sem_timedwait()會使用,我很擔心它的效率。
我真正喜歡的是一個無鎖方案,如https://lwn.net/Articles/400702/中所述。相關文件內核樹是:
- 內核/跟蹤/ ring_buffer_benchmark.c
- 內核/跟蹤/ ring_buffer.c
- 文檔/跟蹤/環形緩衝區design.txt
是如何實現無鎖的記錄在這裏:https://lwn.net/Articles/340400/
不過,我認爲這些是內核實現,不能直接在用戶空間中使用(如ring_buffer_benchmark.c中的示例)。有什麼方法可以在用戶空間中重用這些方案嗎?也希望我能找到更多的例子。
同樣在那篇文章(lwn 40072)中,提到了一種使用perf工具的替代方法,這與我正在嘗試做的似乎很相似。如果2不行,我會嘗試這種方法。
的用戶空間PERF工具因此與 內核交互通過讀出並在共享存儲器區域,而無需使用系統調用 寫入。
對不起,我的英語語法...希望它是有意義的。
嗨Tsyvarev。是的,具有內存邊界的循環緩衝區看起來像更多。直截了當的解決方案!我會試試看看它是如何工作的! 非常感謝 – Fengggli
如果頭指針在內核空間(生產者)中定義並且尾指針在用戶空間(消費者)中定義,那就好了。如果存在生產/消費操作,則頭/尾指針仍然耦合在一起,例如: – Fengggli
例如: 在生產者端仍然需要尾部信息: > if(CIRC_SPACE(head,tail,buffer->大小)> = 1) 這是否表明,每當生產者想要寫入循環緩衝區時,它都必須獲取最新的尾指針值?似乎我應該把這兩個指針放在共享空間中。 – Fengggli