2016-02-29 2 views
2

Я выделяю буфер в своем драйвере с помощью devm_kzalloc(.., .., GFP_KERNEL), а затем регистрирую этот буфер в качестве драйвера фреймбуфера, чтобы он отображался как файл под /dev/fb0. Затем я могу открыть этот файл и написать ему. Когда я делаю это так, все работает нормально, и мои данные поступают в буфер памяти драйвера.Драйвер ядра и mmap из пользовательского пространства

Однако, если я тогда mmap его в пользовательском процессе следующим образом: mmap(NULL, size, PROT_WRITE, MAP_SHARED, fd, 0), используя тот же файл fd и попытайтесь записать в возвращенное пространство памяти, ничего не записывается в память драйвера.

Я что-то забыл?

+1

http://man7.org/linux/man-pages/man2/mmap.2.html - внимательно прочитайте параграф MAP_SHARED, там может быть ключ. – Mat

ответ

2

Получил это! Я делал все неправильно. Мне пришлось настроить систему vm для правильной обработки mmap, и это нужно было сделать с помощью fb_deferred_io (чего у меня даже не было, пока я не включил некоторые несвязанные драйверы, которые его выбрали). Затем мне пришлось использовать __get_free_pages вместо devm_kzmalloc(), и одна последняя деталь заключалась в использовании __pa (vmem) при назначении указателя буфера экрана для подсистемы fbdev. Затем он начал работать :-)

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