我有一个分配大量内存缓冲区的内核模块,然后将该缓冲区映射到用户空间中。
模块从硬件接收一些数据,然后将新数据放入带有标志的缓冲区中。(内存初始化为零,标志为1)。
用户空间程序在返回指向有效数据的指针之前循环读取标志
代码的简化版本:
uint8_t * getData()
{
while(1)
{
if(*((volatile uint32_t*)this->buffer) == 1)
return this->buffer+sizeof(uint32_t);
}
}
内存区域被映射为共享,并且完整的缓冲区内存转储确认缓冲区已正确写入。
问题是在一定数量的正确读取后,此函数停止返回。
这可能是由于 CPU 缓存造成的吗?有没有办法避免这种情况并确保每次都直接从 RAM 读取而不是从缓存中读取?