Коллеги, хочу посоветоваться насчёт выбора подходящей модели взаимодействия между драйвером и аппликацией.
Задачка такая:
Девайс - многоканальный контроллер на MPC83xx PQ2 Pro. К чёрту подробности, короче эта штука должна уметь принимать/отдавать данные по 256 каналам параллельно в непрерывном режиме блоками по 8K. таковы требования.
Реализовал драйвер для этого девайса с ioctl() интерфейсом до каналов внутри него, т.е. ioct() возвращает некий дескриптор, соответствующий конкретному каналу. Через этот дескриптор предполагается реализовать всё взаимодействие - постановка блоков в буфер-ринг канала на воспроизведение/запись, оповещение о событиях. Требование такое - никакого копирования из юзер-спейса в кернел-спейс и обратно, буфера алоцируются драйвером при старте и мапируются в юзер-спейс в контексте конкретной сессии ввода/вывода. И главное требование - взаимодействие должно быть асинхронное.
Пока хочу сделать так - в дескрипторе канала реализовать следующее апи:
-write() отправка команды каналу. Команда - структура с кодом операции и оффсетом в буфере канала, по которому находятся данные на воспроизведение или запись
-read() чтение результата предыдущей операции, возвращает ту же структуру с оффсетом в буфере и с кодом результата.
Между write() и read() пользовательский процесс должен "спать", вернее слушать события от множества каналов и оповещать о событиях верхний уровень, логика которого - подсунуть очередной кусок на воспроизведение, обработать принятый кусок или остановить сессию.
Вопрос такой: существует ли готовое API, которое соответствует требованиям задачи, стоит ли городить собственный огород?
Асинхронный ввод-вывод (выбор стратегии)
Модератор: Модераторы разделов
-
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Асинхронный ввод-вывод
stari_maček
Может поможет Netlink?
Может поможет Netlink?
-
- Сообщения: 116
- ОС: RFRemix 18
Re: Асинхронный ввод-вывод
Спасибо, к своему стыду не знал про него. Похоже, я написал свой нетлинк, только более специфичный, без сокетов, но с блэкджеком и .. сами знаете
А тут реализация более универсальная и развесистая.
Немного непонятно, как тут передаются данные? Что происходит в результате этого вызова
Код: Выделить всё
/* wait for message coming down from user-space */
skb = skb_recv_datagram(nl_sk, 0, 0, &err);
Данные копируются или мапируются?
-
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Асинхронный ввод-вывод
Ну скажем, так выглядили реализации Netlink для старых ядер (2.0). Сейчас он обходится без передачи дескриптора сокета/канала и прочей инфы через ioctl.
Избежать копирования можно с помощью, кажется tie (не помню точное название), вызова, который появился примерно в ядре 2.6.23 - стоит поискать в ядерном ChangeLog, на LKWN ещё была хорошая статья с примерами. Он позволяет передать данные между буферами ядра, без предварительного копирования этих данных в userspace.
-
- Сообщения: 116
- ОС: RFRemix 18