реклама на сайте
подробности

 
 
> Можно ли замапить память юзер спейс для pcie устройства?, вопрос так скажем от новичка.
novartis
сообщение Nov 13 2015, 18:46
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Вот есть у меня линукс-драйвер для pcie устройства (отладочная плата альтеры). Он еще весьма сырой.
В интернете видел, что бары девайса мапятся в юзер спейс программу с помощью mmap. Своими руками такое еще не реализовал smile3046.gif .
И в итоге можно в юзер спейс программе писать или читать по выделенным функцией mmap адресам. Это транслируется в запросы записи или чтения на шину pcie. И в итоге эти запросы попадают в плис и уходят в память, которая подключена к барам у pcie ядра в плис.
Это выглядит как прямое отображение памяти баров девайса в эзер спейс программу.

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

PS: LDD читал, читаю и читать буду, но пока каша в голове.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
novartis
сообщение Dec 9 2015, 10:33
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



С помощью userspace кода, указанного по ссылке выше, получилось сделать задуманное. Сейчас плис пишет прямо в буфер юзер спейс программы. Все довольно шустренько работает. Но вот зародился такой вопрос.
Плиска пишет пакет данных, размером чуть меньше страницы (~4000 байт). В конце записи плиска приписывает флаг по определённому адресу, указывающему, что запись закончена. Проц все время в while читает этот флаг. Как только проц определил, что флаг взвелся, он приступает к работе с данными. Но это не оптимально. Можно было бы начинать работать с данными по мере их поступления.
Придумали следующий вариант. Плиска все равно в шину отправляет данные пакетиками по 128байт. Из них последние 8байт отводим под флаг. Проц мониторит флаг первого пакетака - если флаг взвелся, проц может проанализировать 120 байт переданных ему данных, и переходит к считыванию флага следующего пакетика. И т.д.

А может быть есть другие средства/механизмы удостовериться в том, что данные обновились? Какие-нибудь волшебные ассемблерные вставки? rolleyes.gif

Помимо этого озадачивает следующее. Данные плиска пишет прямо в физ. память. А проц читает не саму память, а кеш первого уровня, в котором отображается блок памяти, размером с кеш линию (обычно 64байт). Так мне объяснил коллега.
Каким образом узнать (гарантировать), что в кеше процессора актуальные данные, что из Плиски вот только что не прилетели новые данные?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 00:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01346 секунд с 7
ELECTRONIX ©2004-2016