The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Linux. Драйвер. Память."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Linux. Драйвер. Память."
Сообщение от unkn2000 Искать по авторуВ закладки on 24-Дек-03, 11:24  (MSK)
Как в драйвере (kernel mode) организовать передачу данных из устройства
непосредственно в буфер процесса (user mode), минуя буфер в драйвере?

ОС Linux 2.4.18.
PCI устройство в режиме мастеринга (без участия процессора, как в DMA) заливает данные в буфер памяти. Адрес начала буфера и его размер я пишу в порты в\в устройства.
Хотелось бы передавать устройству физический адрес буфера процесса запросившего данные.
Объемы данных (несколько аудио и видео потоков) большие и поэтому лишнее
копирование из устройства в буфер драйвера и оттуда в буфер процесса крайне не желательно. В то же время использовать для перекачки данных процессор, когда драйвер читает данные из порта и передаёт их процессу ( что-то типа put_user(inb(PORT), buf++); ) то же достаточно
накладно.
Как можно реализовать схему при которой данные из устройства сразу поступают в адресное  пространство процесса ждущего данные?

Что-то типа следующего:
Процесс получает буфер (malloc) и передаёт указатель на него и его размер в драйвер (при помощи ioctl). Процесс засыпает в ioctl (при помощи очереди ожидания). В драйвере определяется физический адрес этого буфера и передаётся устройству. Устройство заполняет буфер данными и генерирует прерывание. В обработчике прерывания процесс пробуждается и
при выходе из ioctl буфер либо заполнен либо возвращается код ошибки.

Подскажите хоть в каком направлении рыть.

А лучше пример кода с комментариями.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Linux. Драйвер. Память."
Сообщение от genie Искать по авторуВ закладки on 29-Дек-03, 03:08  (MSK)
Posmotri mlock() (no eto ne dlya kernel, eto dlya R3).

>Как в драйвере (kernel mode) организовать передачу данных из устройства
>непосредственно в буфер процесса (user mode), минуя буфер в драйвере?
>
>ОС Linux 2.4.18.
>PCI устройство в режиме мастеринга (без участия процессора, как в DMA) заливает
>данные в буфер памяти. Адрес начала буфера и его размер я
>пишу в порты в\в устройства.
>Хотелось бы передавать устройству физический адрес буфера процесса запросившего данные.
>Объемы данных (несколько аудио и видео потоков) большие и поэтому лишнее
>копирование из устройства в буфер драйвера и оттуда в буфер процесса крайне
>не желательно. В то же время использовать для перекачки данных процессор,
>когда драйвер читает данные из порта и передаёт их процессу (
>что-то типа put_user(inb(PORT), buf++); ) то же достаточно
>накладно.
>Как можно реализовать схему при которой данные из устройства сразу поступают в
>адресное  пространство процесса ждущего данные?
>
>Что-то типа следующего:
>Процесс получает буфер (malloc) и передаёт указатель на него и его размер
>в драйвер (при помощи ioctl). Процесс засыпает в ioctl (при помощи
>очереди ожидания). В драйвере определяется физический адрес этого буфера и передаётся
>устройству. Устройство заполняет буфер данными и генерирует прерывание. В обработчике прерывания
>процесс пробуждается и
>при выходе из ioctl буфер либо заполнен либо возвращается код ошибки.
>
>Подскажите хоть в каком направлении рыть.
>
>А лучше пример кода с комментариями.


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру