Добрый день ,
Занимаясь разработкой драйвера под вышеуказанную платформу наткнулся на занятную проблему, связанную с работой кеша в ос. В устройстве создан источник данных , доставляющий через DMA данные непосредственно в оперативную память устройства. Для работы с этим было создано два приложения, одно из них - драйвер, создает область разделяемой памяти и управляет работой аппаратного модуля и DMA, а второе является клиентом , использующим данные по мере поступления. Во избежании копирования был создан блок разделяемой памяти с флагами SHMCTL_PHYS | SHMCTL_GLOBAL | SHMCTL_ANON ( непрерывной, кешируемой , имеющей во всех процессах одинаковое отображение на виртуальные адреса ), в расчете на то, что после записи данных можно будет сделать cache invalidate, и использовать данные без задержек. Однако данная реализация оказалась проблемной, функция CACHE_INVAL библиотеки libcache занимает значительную часть процессорного времени, примерно аналогичное время тратится если запретить кеширование в разделяемой памяти и вычитывать данные с помощью memcpy... (Размер блока данных порядка 1,5МБ)
Хотелось бы узнать нормально ли такое поведение libcache, возможно кто сталкивался с подобным? Возможно сама схема , которую я выбрал является не совсем корректной и есть более "прямой" в плане реализации вариант ?
( Прикрепляю две картинки с фото происходящего с точки зрения системного профайлера, а также соответствующие им kev. )
( точнее они доступны по ссылке
https://drive.google.com/folderview?id=0B6ejWgMiaZIvNm1jSl9fWllERjQ&usp=sharing , в сообщение не влазят)