Форум программистов «Весельчак У»
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
Начало
Наши сайты
Галерея
Весельчак У
Наша Вики
Хранилище
Проекты
Правила
Правила форума
Правила русского языка
Помощь
Поиск
Календарь
Почта
Войти
Регистрация
Форум программистов «Весельчак У»
>
Направления программирования
>
Drivers
(Модераторы:
Ochkarik
,
aks68
) > Тема:
Linux. Драйвер. Память.
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Linux. Драйвер. Память. (Прочитано 4633 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
unkn2000
Гость
Linux. Драйвер. Память.
«
:
18-12-2003 09:21 »
Как в драйвере (kernel mode) организовать передачу данных из устройства непосредственно в буфер процесса (user mode), минуя буфер в драйвере?
ОС Linux 2.4.18.
PCI устройство в
режиме мастеринга
(без участия процессора, как в DMA) заливает данные в буфер памяти. Адрес начала буфера и его размер я пишу в порты в\в устройства.
Хотелось бы передавать устройству физический адрес буфера процесса запросившего данные.
Объемы данных (несколько аудио и видео потоков) большие и поэтому лишнее копирование из устройства в буфер драйвера и оттуда в буфер процесса крайне не желательно. В то же время использовать для перекачки данных процессор, когда драйвер читает данные из порта и передаёт их процессу ( что-то типа put_user(inb(PORT), buf++); ) то же достаточно накладно.
Как можно реализовать схему при которой данные из устройства сразу поступают в
адресное пространство процесса
ждущего данные?
Что-то типа следующего:
Процесс получает буфер (malloc) и передаёт указатель на него и его размер в драйвер (при помощи ioctl). Процесс засыпает в ioctl (при помощи очереди ожидания). В драйвере определяется
физический адрес
этого буфера и передаётся устройству. Устройство заполняет буфер данными и генерирует прерывание. В обработчике прерывания процесс пробуждается и при выходе из ioctl буфер либо заполнен либо возвращается код ошибки.
Подскажите хоть в каком направлении рыть.
Записан
RXL
Технический
Администратор
Offline
Пол:
Linux. Драйвер. Память.
«
Ответ #1 :
18-12-2003 10:59 »
В общих словах: нужно заблокировать блок в памяти и найти его физический адрес.
Посмотри следующее mm/mlock.c (блокировка) и mm/memory.c (get_user_pages() и map_user_kiobuf()). Может чем поможет. Как они работают, или правильнее сказать, как правильно их применять - не знаю, не применял.
Да и вот - в разделе "файлы" лежит книга "Linux Device Drivers, 2nd edition" - раздел 13-й "mmap and DMA"/"The kiobuf Structure"/"Mapping User-Space Buffers and Raw I/O" - похо же что то что тебе нужно.
Записан
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Форум программистов «Весельчак У»
>
Направления программирования
>
Drivers
(Модераторы:
Ochkarik
,
aks68
) > Тема:
Linux. Драйвер. Память.
Загружается...