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