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