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