The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Linux. Драйвер. Память., !*! unkn2000, 24-Дек-03, 11:24  [смотреть все]
Как в драйвере (kernel mode) организовать передачу данных из устройства
непосредственно в буфер процесса (user mode), минуя буфер в драйвере?

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

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

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

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

  • Linux. Драйвер. Память., !*! genie, 03:08 , 29-Дек-03 (1)
    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 буфер либо заполнен либо возвращается код ошибки.
    >
    >Подскажите хоть в каком направлении рыть.
    >
    >А лучше пример кода с комментариями.




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

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