LINUX.ORG.RU

Разработка PCI драйвера и функции, хелп!


0

0

Здравствуйте уважаемые форумчане.

У меня задача написать драйвер для PCI-E платы и измерить скорость передачи данных.

Если кто знает, подскажите пожалуйста, как правильно измерять скорость передачи данных из компьютера в память платы и наоборот? Каковы основные принципы, шаги решения этой проблемы?

Заранее спасибо.

1. Начинаешь измерять 2. Измеряешь 3. Заканчиваешь имзерять 4. Profit

Если на каком-то из этапов вылезут ошибки, то исправляешь их.

anonymous
()

Безтолковых людей прошу воздержаться от постов, интересуют ответы разбирающихся в этом вопросе людей.

maniac85
() автор топика

Можно попробовать использовать tsc ( rdtsc ), но процессор может менять частоту во время работы. Вообще здесь много постов по этому вопросу можно найти.

karak
()
Ответ на: комментарий от karak

> использовать tsc
а у разных ядер/процессоров tsc не может быть не синхронным?

cobold ★★★★★
()
Ответ на: комментарий от maniac85

> Безтолковых людей прошу воздержаться от постов, интересуют ответы разбирающихся в этом вопросе людей.

Основные шаги? Основные шаги это чтение документации на твой PCI-контроллёр. Потом изучение PCI-подсистемы в ядре. Или ты думаешь, что здесь тебе дадут пример кода?

Ты вообще задал черезчур абстрактный вопрос, и получил на него соответсвтующий ответ. Если хочешь, чтоб такого не было - задавай более конктрентые вопросы. Например: у меня есть PCI железка с поддержкой bus-master, работает она на ультра-спарке, с таким-то вот контроллёром. Как померять среднюю скорость передачи данных за такой-то промежуток с такой-то погрешностью?

А всё, что ты здесь развёл - это бестолковый бред.

anonymous
()

> У меня задача написать драйвер для PCI-E платы и измерить скорость передачи данных.

> как правильно измерять скорость передачи данных из компьютера в память платы и наоборот? Каковы основные принципы, шаги решения этой проблемы?

Тебе нужно написать полноценный драйвер или только стабы для посылания мусора в плату? Да и вообще, напиши сначала драйвер. Думаю, пока будешь писать - глупые вопросы сами отпадут

anonymous
()
Ответ на: комментарий от anonymous

Вообще написали что-то типа драйвера - программа работающая в юзерспейсе. Записывает в память платы и считывает от туда данные.

Опишу ситуацию подробнее. Купили плату разработки от Altera. Но для нее нет драйверов под Linux. Нужно обеспечить запись данных в память платы и считывание данных а так же измерить скорость чтения и записи.

Суешь плату в PCI-E слот и тк дров нету под нее, lspci показывает Unknown Device. Но пишет что busmaster есть. В папке /dev/ появился файл "mem" - это и есть память платы. Каким раком если дров нету Linux всеже находит эту память?

А программа типа драйвера получает доступ к данной памяти посредством функции mmap.

Рассказываю как я НЕПРАВИЛЬНО измерял скорость чтения и записи:

Измерял текущее время с точностью до микросекунд перед циклом записи или чтения, потом сразу после этого измерял время второй раз, находил время а за которое производилась запись или чтение и переводил в скорость.

Я понимаю что это не правильно. Всеже скорость получилась чтото около 10-20 мегабайт в секунду. Просто точно нельзя таким методом узнать в какой момент закончилась запись. Линукс может долго тупить перед тем как выполнить следущую строчку и выполнить еще кучу других операций. Почитав литературу стал понимать что такую задачу можно выполнить обратчиком прерываний. Тоесть процессор получает сигнал о том что, например, запись в память платы закончена.

Нужно получить максимальную скорость а это теоретически должно быть чтото около 2 гигов в секунду. Для этого как я понял нужно работать в режиме DMA.

Сам я модуль ядра писать не хочу. На это уйдет стопиццот лет. Я решил воспользоваться программой WinDriver там можно создать драйвер и кернел плагин. Меня интересует последовательность шагов необходимых для решения этой проблемы.

Хоть схему или просто сказать что по шагам нужно делать.

Типа чтобы осужествить запись в DMA режиме нужно DMA контроллеру прописать в регистры адрес откуда и адрес куда. И подать команду на запись или чтение.

Где этот DMA контроллер находится?? Какой адрес ему прописывать виртуальный или физический (адрес памяти) ? Как записывать в его регистры?

Вот как мой лаймерский мозг представляет как это должно работать:

WinDriver создает драйвер и кернел плагин для платы.

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

Далее эту функцию можно вызывать из драйвера?

Совсем запутался.

maniac85
() автор топика
Ответ на: комментарий от maniac85

>В папке /dev/ появился файл "mem" - это и есть память платы.

Вообще-то /dev/mem это не память платы, а физическая память компьютера (man mem).

>А программа типа драйвера получает доступ к данной памяти посредством функции mmap.

Видимо твое устройство отображает в пространство физических адресов CPU свои регистры и/или память. Вот юзерспейс прога через /dev/mem и доступается к ним.

>Сам я модуль ядра писать не хочу. На это уйдет стопиццот лет.

Тогда ты ничего полезного не сделаешь. Если нужен драйвер, то придется изучить (хотя бы в общих чертах), что такое PCI и как писать linux драйверы для устройств PCI (в том числе и как пользоваться DMA). Это все не так уж страшно. Рекомендую начать с прочтения LDD3: http://lwn.net/images/pdf/LDD3

anonymous
()
Ответ на: комментарий от maniac85

> Суешь плату в PCI-E слот и тк дров нету под нее, lspci показывает Unknown Device. Но пишет что busmaster есть. В папке /dev/ появился файл "mem" - это и есть память платы. Каким раком если дров нету Linux всеже находит эту память?

Присоединяюсь к совету о прочтении соответствующих глав LDD3. Если вкратце, у PCI устройства имеется конфигурационное пространство, в котором есть, кроме всего прочего VENDOR_ID и DEVICE_ID. Их ядро видит и без дров и по ним, обычно, определяется какой драйвер нужно использовать для работы с этим PCI устройством.

Как скорость померить... сходу даже не скажу :) Могу лишь посоветовать пересылать большие объёмы данных, чтобы погрешность была меньше. Переслав разные объёмы по многу раз можно получить примерную картину.

lv ★★
()
Ответ на: комментарий от maniac85

1. Обязательно посмотри доки по PCI. 2. Почитай доки по DMA 3. Читай доки по DMA/PCI для ядра линукса.

Вообще, в ядре уже есть подсистемы для работы с DMA, там всё довольно прозрачно.

Да, я не знаю, что такое WinDriver. Может тебе будет проще взять какой-нить готовый драйвер и посмотреть на примере, как он работает?

Можешь посмотреть на драйвера сата-контроллёров, например.. Если они могут AHCI - то кода вроде будет не много. Да, тебе ещё придётся посмотреть доки на сам чипсет контроллёра.

anonymous
()
Ответ на: комментарий от lv

> Присоединяюсь к совету о прочтении соответствующих глав LDD3. Если вкратце, у PCI устройства имеется конфигурационное пространство, в котором есть, кроме всего прочего VENDOR_ID и DEVICE_ID. Их ядро видит и без дров и по ним, обычно, определяется какой драйвер нужно использовать для работы с этим PCI устройством.

Дело в том что для платы есть драйвера, но под винду, а задача заставить пахать и на линуксе.

Сейчас читаю доки по DMA

Насколько я понял имеют место быть 2 DMA контроллера.

1-й на материнской плате (ему передаются параметры: КУДА, ОТКУДА, СКОЛЬКО)

2-й на PCI-E плате (реализован в FPGA)

Если линукс автоматически видит память платы и отображает как /dev/mem, значит для DMA достаточно первого контроллера?

Вычитал тут про Арбитора, который разрешает или запрещает устройствам DMA режим для сессии. Это процессорный блок или отдельная микросхема? Как он по англиски правильно называется?

maniac85
() автор топика
Ответ на: комментарий от maniac85

Мой колега уже сделал рабочий драйвер под винду используя ВинДрайвер, и заметьте - без каких-либо знаний программирования модулей ядра :) Теперь осталось так же сделать под линукс.

maniac85
() автор топика
Ответ на: комментарий от maniac85

> Мой колега уже сделал рабочий драйвер под винду используя ВинДрайвер, и заметьте - без каких-либо знаний программирования модулей ядра :) Теперь осталось так же сделать под линукс.


Ну так это же сущая ерунда - пусть коллега возьмёт ЛиньДрайвер и сделает рабочий драйвер под Линукс.

anonymous
()
Ответ на: комментарий от anonymous

ага... если хочется чтобы было все так просто то... нужно отстегнуть 2 штуки баксов за программу.

maniac85
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.