大きなメモリ バッファを割り当てるカーネル モジュールがあり、このバッファはユーザー空間に mmap されます。
モジュールはハードウェアからいくつかのデータを受信し、その前にフラグを付けて新しいデータをバッファに入れます。(メモリはゼロに初期化され、フラグは 1)。
ユーザー空間プログラムは、有効なデータへのポインターを返す前にループでフラグを読み取ります
コードの簡略版:
uint8_t * getData()
{
while(1)
{
if(*((volatile uint32_t*)this->buffer) == 1)
return this->buffer+sizeof(uint32_t);
}
}
メモリ領域は共有としてマップされ、フル バッファ メモリ ダンプにより、バッファが正しく書き込まれていることが確認されます。
問題は、一定数の正しい読み取りの後、この関数が戻りを停止することです。
これはCPUキャッシングが原因でしょうか?それを回避し、読み取りがキャッシュからではなく RAM から毎回直接行われるようにする方法はありますか?