У меня есть модуль ядра, который выделяет большой буфер памяти, этот буфер затем mmap-ed в пользовательское пространство.
Модуль получает некоторые данные с аппаратного обеспечения, а затем помещает новые данные в буфер с флагом перед ним. (память инициализируется в ноль, флаг равен 1).
Программа userpace читает флаг в цикле перед возвратом указателя на действительные данные
упрощенная версия кода:
uint8_t * getData()
{
while(1)
{
if(*((volatile uint32_t*)this->buffer) == 1)
return this->buffer+sizeof(uint32_t);
}
}
область памяти отображается как общая, и полный дамп буферной памяти подтверждает, что буфер записан правильно.
Проблема в том, что после определенного числа правильных чтений эта функция перестает возвращаться.
Может ли это быть связано с кэшированием процессора? Есть ли способ обойти это и убедиться, что чтение производится каждый раз непосредственно из ОЗУ, а не из кэша?