2016-10-14 2 views
0

Требование: ядро ​​и пользовательское пространство используют огромную память через mmap. Пользовательское пространство является производителем, а ядро ​​является потребителем.синхронизация ядра и пользовательского пространства на mmap-области

Я написал модуль ядра, который создает устройство и реализует системный вызов mmap и выделяет буфер ядра. Пользовательское пространство открывает устройство и вызывает mmap и что-то пишет. Ядро считывает поток через таймер каждые 5 секунд, и он отлично работает.

Проблема заключается в том, как синхронизировать эту область mmap'ed.

Solutions я думал:

1) После записи области MMAP, посылает пользовательское NETLINK уведомление, которое отмечает глобальный флаг говорят данные готовы и ядро ​​готово читать прямо сейчас.

2) После записи в область mmap пользовательское пространство ioctl, которое отмечает глобальный флаг, говорит, что данные готовы, и ядро ​​готово к чтению сейчас.

Есть ли лучшие подходы?

ответ

0

Вы можете реализовать блокировку пространства ядра. Прежде чем ядро ​​прочитает разделяемую память, он должен получить блокировку, иначе ее не удалось прочитать; перед тем, как пользователь будет писать разделяемую память, он также должен получить блокировку, иначе он не смог бы написать. Вы можете реализовать ioctl в своем драйвере ядра, который получает блокировку, и пользователь должен вызвать ioctl перед записью памяти.

Смежные вопросы