Всегда ли действительно необходим msync при записи в /dev/mem?

Я использую mmap для открытия /dev/mem для чтения/записи в регистры UART. Это работает хорошо, но мой вопрос: действительно ли нужен системный вызов msync с флагом MS_SYNC после записи?

Насколько я понимаю, /dev/mem — это виртуальное устройство, которое обеспечивает доступ к зонам физической памяти (в моем случае это регистры UART) путем преобразования адреса виртуальной памяти и, таким образом, предоставляет доступ к некоторой физической памяти из пользовательского пространства.

Это не обычный файл, и я предполагаю, что модификации регистров не буферизируются/кешируются. На самом деле я хотел бы избежать этого системного вызова по соображениям производительности.

Спасибо


person Fryz    schedule 20.06.2017    source источник
comment
Я использую mmap для открытия /dev/mem для чтения/записи в регистры UART. большая ошибка. Используйте для этого драйвер ядра и последовательные API.   -  person Chris Stratton    schedule 22.06.2017


Ответы (1)


Насколько я понимаю, msync() необходим для обновления данных в обычном файле, который изменяется с помощью сопоставления, созданного с помощью mmap().

Но когда вы используете mmap на /dev/mem, вы не сопоставляете обычный файл на диске, вы просто сопоставляете желаемый диапазон аппаратной памяти непосредственно с виртуальным адресным пространством вашего процесса, поэтому msync() не по теме, так и будет. ничего такого.

Единственное, что находится между вашей записью в виртуальное пространство с mmapped и аппаратным устройством, — это кэш ЦП. Чтобы заставить это, вы можете принудительно очистить кеш (может быть, __clear_cache()?), но это обычно не нужно, потому что ядро ​​​​идентифицирует регистр устройства с отображением памяти и отключает кеш для этого диапазона. В процессорах X86 это обычно делается с помощью MTRR, но с ARM я не знаю подробностей...

person rodrigo    schedule 20.06.2017