0

我想在用戶和內核空間之間構造兩個共享隊列(一個命令隊列和一個回覆隊列)。這樣內核就可以向用戶空間發送消息,用戶空間在完成處理後可以向內核發送回覆。我所做的是使用爲用戶空間分配內核內存頁面(用於隊列)和mmap,現在用戶和內核都可以訪問這些頁面(這裏我指的是在內核空間中寫入的內容可以正確讀取在用戶空間中,或反之亦然)。內核/用戶地址空間之間共享的無鎖隊列

問題是我不知道如何在內核和用戶空間之間同步訪問。假設我要爲多製造商1用戶方案構建環形緩衝區,那麼如何使這些環形緩衝區訪問不會被同時寫入損壞?

本週我做了一些研究,這裏有一些可能的方法,但我在內核模塊開發方面頗爲新穎,不太確定它是否可行。當挖掘到他們,我會很高興,如果我能得到的任何意見或建議:用戶/內核空間之間

  1. 使用共享信號:Shared semaphore between user and kernel spaces

    但許多系統調用像sem_timedwait()會使用,我很擔心它的效率。

  2. 我真正喜歡的是一個無鎖方案,如https://lwn.net/Articles/400702/中所述。相關文件內核樹是:

    • 內核/跟蹤/ ring_buffer_benchmark.c
    • 內核/跟蹤/ ring_buffer.c
    • 文檔/跟蹤/環形緩衝區design.txt

    是如何實現無鎖的記錄在這裏:https://lwn.net/Articles/340400/

    不過,我認爲這些是內核實現,不能直接在用戶空間中使用(如ring_buffer_benchmark.c中的示例)。有什麼方法可以在用戶空間中重用這些方案嗎?也希望我能找到更多的例子。

  3. 同樣在那篇文章(lwn 40072)中,提到了一種使用perf工具的替代方法,這與我正在嘗試做的似乎很相似。如果2不行,我會嘗試這種方法。

    的用戶空間PERF工具因此與 內核交互通過讀出並在共享存儲器區域,而無需使用系統調用 寫入。

對不起,我的英語語法...希望它是有意義的。

回答

0

對於內核和用戶空間之間的同步,您可以使用曲線緩衝區機制(文檔位於Documentation/circular-buffers.txt)。

這樣的緩衝區的關鍵因素是兩個指針(頭部和尾部),它們可以單獨更新,這非常適合分離的用戶和內核代碼。而且,循環緩衝區的實現非常簡單,所以在用戶空間中實現並不困難。

請注意,對於內核中的多個生產者,您需要將它們與spinlock或類似的同步。

+0

嗨Tsyvarev。是的,具有內存邊界的循環緩衝區看起來像更多。直截了當的解決方案!我會試試看看它是如何工作的! 非常感謝 – Fengggli

+0

如果頭指針在內核空間(生產者)中定義並且尾指針在用戶空間(消費者)中定義,那就好了。如果存在生產/消費操作,則頭/尾指針仍然耦合在一起,例如: – Fengggli

+0

例如: 在生產者端仍然需要尾部信息: > if(CIRC_SPACE(head,tail,buffer->大小)> = 1) 這是否表明,每當生產者想要寫入循環緩衝區時,它都必須獲取最新的尾指針值?似乎我應該把這兩個指針放在共享空間中。 – Fengggli

相關問題