簡體   English   中英

mmap共享緩沖區讀取問題

[英]mmap shared buffer read problems

我有一個內核模塊,該模塊分配了很大的內存緩沖區,然后將該緩沖區映射到用戶空間。
該模塊從硬件接收一些數據,然后將新數據放入緩沖區中,並在其前面帶有一個標志。 (內存初始化為零,標志為1)。

用戶空間程序在返回指向有效數據的指針之前先在循環中讀取標志

代碼的簡化版:

uint8_t * getData()
{
    while(1)
   {
      if(*((volatile uint32_t*)this->buffer) == 1)
          return this->buffer+sizeof(uint32_t);
   }
}

內存區域被映射為共享,並且完整的緩沖區內存轉儲確認緩沖區已正確寫入。

問題在於,經過一定數量的正確讀取后,此函數將停止返回。
這可能是由於CPU緩存引起的嗎? 有沒有一種方法可以避免這種情況,並確保每次都是直接從RAM而不是從緩存進行讀取?

是的,這可能是由於讀取器端的cpu緩存。 有人可能會認為“ volatile”關鍵字應該可以防止此類問題,但這並不是很正確,因為volatile只是指示編譯器不要注冊變量,這與指示cpu直接從主內存中讀取並不完全相同每次。

該問題需要在寫端解決。 根據您的描述,聽起來好像是在內核模塊中進行寫操作並從用戶端讀取。 如果這兩個操作發生在不同的cpus(不同的緩存域)上,並且沒有什么可以觸發讀取端的緩存失效,那么您將被描述為卡在讀取端。 在您執行存儲指令后,您需要在Linux內核上強制刷新存儲緩沖區。 假設它是Linux內核,則在設置了標志之后立即插入對smp_mb的調用,模塊中的值很可能在所有體系結構上都可以正確執行。

提醒用戶空間應用程序存在更多數據的更好方法是,將其阻止在內核模塊提供的文件描述符的read() ,當更多數據可用時,內核模塊將其喚醒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM