The OpenNET Project / Index page

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

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

"Как в ядре 'промапить' пользовательскую память?"  
Сообщение от Nzdrw email(ok) on 09-Июн-07, 08:30 
Привет, Я пишу драйвер для usb-камеры. Передача происходит по вызову IOCTL из приложения, где передается указатель на область памяти в user_space. Обработчик ioctl выполняет usb_bulk_msg, который складывает все принятое по указателю, и я так понимаю, что эта функция работает в dma режиме.
- что нужно сделать, чтоб usb_bulk_msg складывал напрямую по указателю в user_space?
Пасибо.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от NuINu (??) on 09-Июн-07, 09:44 
>Привет, Я пишу драйвер для usb-камеры. Передача происходит по вызову IOCTL из
>приложения, где передается указатель на область памяти в user_space. Обработчик ioctl
>выполняет usb_bulk_msg, который складывает все принятое по указателю, и я так
>понимаю, что эта функция работает в dma режиме.
>- что нужно сделать, чтоб usb_bulk_msg складывал напрямую по указателю в user_space?
>
>Пасибо.
А можно поинтересоваться именно типом веб камеры? я то сам драйверов писать не умею, вот и думаю может кто напишет? :-)
А вообще говоря, вкратце ознакомившись с исходниками v4l(я думаю ты это уже сделал?)
я заметил что в модуле: usbvideo.c
есть функция
/*
* usbvideo_v4l_read()
*
* This is mostly boring stuff. We simply ask for a frame and when it
* arrives copy all the video data from it into user space. There is
* no obvious need to override this method.
*
*/
ты можешь посмотреть как это сделано там. Но я не понимаю, может быть лучше тот драйвер что ты пишешь, сделать именно в рамках концепции v4l?


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от NuINu (??) on 09-Июн-07, 10:10 
>>Привет, Я пишу драйвер для usb-камеры. Передача происходит по вызову IOCTL из
>>приложения, где передается указатель на область памяти в user_space. Обработчик ioctl
>>выполняет usb_bulk_msg, который складывает все принятое по указателю, и я так
>>понимаю, что эта функция работает в dma режиме.

Кстати вот код из драйвера для stv680:
-------------------------------
static ssize_t stv680_read (struct file *file, char __user *buf,
                        size_t count, loff_t *ppos)
{
        struct video_device *dev = file->private_data;
        unsigned long int realcount = count;
        int ret = 0;
        struct usb_stv *stv680 = video_get_drvdata(dev);
        unsigned long int i;
......
        if (!stv680->streaming)
                stv680_start_stream (stv680);

        if (!stv680->streaming) {
                ret = stv680_newframe (stv680, 0);      /* ret should = 0 */
        }

        ret = stv680_newframe (stv680, 0);
        if (!ret) {
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                if ((i = copy_to_user (buf, stv680->frame[0].data, realcount)) != 0) {
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        PDEBUG (2, "STV(e): copy_to_user frame 0 failed, ret count = %li", i);
                        return -EFAULT;
                }
        } else {
                realcount = ret;
        }
        stv680->frame[0].grabstate = FRAME_UNUSED;
        return realcount;
------------------------------------------------
>>- что нужно сделать, чтоб usb_bulk_msg складывал напрямую по указателю в user_space?
Я так понимаю, ты не оттуда пытаешься записать в юзер спейс?
или ты туда не кадр хочешь передать а какую-то служебную информацию?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от Nzdrw email(ok) on 09-Июн-07, 10:21 
Да, я хочу в юзерспейс кинуть кадр... НО! миную память ядра... эдакий "direct stream" :)
Вот выкопал get_user_pages из LDD3,,, не могу с ней разобраться... пока. Вы не в курсе как она работает?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от NuINu (??) on 09-Июн-07, 11:12 
>Да, я хочу в юзерспейс кинуть кадр... НО! миную память ядра... эдакий
>"direct stream" :)
>Вот выкопал get_user_pages из LDD3,,, не могу с ней разобраться... пока. Вы
>не в курсе как она работает?
не, не в курсе. А опять поинтересуюсь, а зачем тебе это надо? Хочешь отработать новую концепцию построения драйверов? или ускорить чтение кадров?
не не знаю, если что то и получиться, то драйвером это уже будет назвать сложно! Какой же это драйвер, если он данные передает через ioctl? а через read он что будет делать?

зря ты так! Лучше бы нормальный драйвер сделал, и тебе и людям приятно было бы! тебе слава а людям польза!
так какая видео то? или секрет?

да и уж если тебе претит, использование read, для передачи кадров, то можешь покопать с mmap, функции которого как раз и реализуют то что ты хочешь, передача будет вестить в память отмапированную с юзерспейса.(это не факт, но то как я понял разбиравшись с stv680)
и вообще советую внимательно изучить код какого нибудь самого простого драйвера v4l.

Кстаит по stv680 видно, что он принимает данные устанавливая свою функцию irq(вообщемто обычный калбек) когда пользователь выдает запрос на чтение, при этом происходит открытие потока, и в нем то как раз эта функция и устанавливается).
    for (i = 0; i < STV680_NUMSBUF; i++) {
                urb = usb_alloc_urb (0, GFP_KERNEL);
                if (!urb)
                        return -ENOMEM;

                /* sbuf is urb->transfer_buffer, later gets memcpyed to scratch */
                usb_fill_bulk_urb (urb, stv680->udev,
                                   usb_rcvbulkpipe (stv680->udev,                                        
                                   stv680->bulk_in_endpointAddr),
                                   stv680->sbuf[i].data, stv680->rawbufsize,
                                   stv680_video_irq, stv680);
                                   ^^^^^^^^^^^^^^^
дма здесь нет! может оно есть в низлежащих драйверах?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от Nzdrw email(ok) on 09-Июн-07, 10:34 
в общем ч/б камера высокого разрешения(1280х1024) передающая видео в комп со скоростью 15кадр/с. Железку уже сделал... в windows-е драйвер уже работает. Теперь вот линуксом занялся.
класс V4L - мне показался слишком комплексным... со стороны настроек - много всего ненужного - да и фиг его знает - сможет ли этот v4l работать с такими параметрами камеры.

Я решил с ним не заниматься сексом), а пойти в обход. Так то камера уже работает в линуксе - регистры читаются и пишутся и т.д. - осталось с видеопотоком разобраться...
в v4l все сделано с помощью copy_to_user и т.д. - там везде идет предобработка кадра - мне этого не надо - пусть он пишется врям в user_space... чего и пытаюсь сделать.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от NuINu (??) on 09-Июн-07, 11:27 
>в общем ч/б камера высокого разрешения(1280х1024) передающая видео в комп со скоростью
>15кадр/с. Железку уже сделал... в windows-е драйвер уже работает. Теперь вот
>линуксом занялся.
Фига се!!! ты крут!!!

>класс V4L - мне показался слишком комплексным... со стороны настроек - много
>всего ненужного - да и фиг его знает - сможет ли
>этот v4l работать с такими параметрами камеры.
>
да чего бы ему не работать???

>Я решил с ним не заниматься сексом), а пойти в обход. Так
зря! :-)

>то камера уже работает в линуксе - регистры читаются и пишутся
>и т.д. - осталось с видеопотоком разобраться...
>в v4l все сделано с помощью copy_to_user и т.д. - там везде
>идет предобработка кадра - мне этого не надо - пусть он
>пишется врям в user_space... чего и пытаюсь сделать.
слушай, это так концептуально неправильно, что крайне не советую этого делать!!
а что будет если юзерский процесс умрет? куда "оно" потом будет писать?
не делай этого!!! ;-)
гемора наработаешь больше! лучше денек посиди поизучай один!!! всего один драйвер(какой нибудь поменьше dabusb.c или stv680.c), за второй день напишешь свой!!!


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от Nzdrw email(ok) on 09-Июн-07, 14:38 
от v4l я все таки откажусь...


а с памятью разберусь - вроде накопал пример

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от NuINu (??) on 09-Июн-07, 14:43 
>от v4l я все таки откажусь...
>
>
>а с памятью разберусь - вроде накопал пример

:-) святое право разработчика :-)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от Nzdrw email(ok) on 09-Июн-07, 14:54 
usb_buffer_alloc... гыыыы рулит) почему то сначала ругался на эту шнягу

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от jd (??) on 10-Июн-07, 21:26 
Использовать mmap/ioctl - вполне нормальный вариант. К слову сказать, в V4L, упомянутом выше, так и сделано (может read там тоже реализован, не помню, но я использовал в своё время именно вариант с mmap/ioctl).

Проблем с тем, что "юзерский процесс умрет? куда "оно" потом будет писать?" - никаких нет, ибо суть mmap не в том, чтобы писать в пользовательскую память, а в том, чтобы отобразить область памяти ядра в пользовательское адресное пространство. То есть выделяете в драйвере буфер, затем пользовательский процесс его мапит (разумеется не без помощи драйвера) и получает к нему доступ. Защищённый режим работы процессора, как он есть...

В V4L(V4L2, насколько я помню, основная последовательность действий (в пользовательской программе) примерно такая:
- получить/настроить параметры захватывающего устройства (несколько вызовов ioctl)
- замапить буфер кадров (mmap)
- начать захват (ioctl)
- для захвата кадров вызывать пару ioctl: начать капчить кадр в N-й буфер (в драйвере выделен буфер на несколько кадров); дождаться окончания захвата кадра в N-й буфер.

Вот с чем трудно не согласиться, так это с тем, что всё-таки реализовать стандартный интерфейс (то бишь V4L, а точнее, V4L2) было бы куда лучше. Если драйверов для вашей камеры ещё нет... Плюсов тут несколько: проверенный рабочий интерфейс; возможность отлаживать драйвер с существующими уже программами (например каким-нибудь mplayer'ом), а также возможность при необходимости использовать и для работы существующее ПО (тем же mplayer'ом можно не только смотреть, но и писать в файл, например .avi); польза для общества, как уже было сказано выше (ну это, конечно, дело хозяйское).

В любом случае, удачи!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от NuINu (??) on 13-Июн-07, 11:35 
>Использовать mmap/ioctl - вполне нормальный вариант. К слову сказать, в V4L, упомянутом
>выше, так и сделано (может read там тоже реализован, не помню,
>но я использовал в своё время именно вариант с mmap/ioctl).
>
>Проблем с тем, что "юзерский процесс умрет? куда "оно" потом будет писать?"
>- никаких нет, ибо суть mmap не в том, чтобы писать
>в пользовательскую память, а в том, чтобы отобразить область памяти ядра
>в пользовательское адресное пространство. То есть выделяете в драйвере буфер, затем

Я вообщем то не выступал против mmap, просто человек хотел сделать не совсем так. он просто в юзерское пространство из драйвера хотел писать. А когда делается ммап, драйвер никуда в юзерское пространство не пишет, он пишет в свой же буфер, просто ему дела нет кто подмапил этот буфер. в этом случае при крахе пользователя действительно ничего плохого не будет.
тут два совершенно противоположных действия, то что делаей mmap это отражения памяти ядра в  пользовательское пространство, а то что предлагалось по теме пользовательскую память (подмапить) к ядру, и там в него непосредственно писать. что на мой взгляд, будет вызывать крах в 99 процентах случях.

и read конечно же там реализован :-) это mmap не во всех драйверах бывает доступен.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "Как в ядре 'промапить' пользовательскую память?"  
Сообщение от Nzdrw email(ok) on 13-Июн-07, 12:44 
в общем - не получилось у меня с памятью :( то ли руки кривые(скорее всего) то ли подход не тот.
В общем, берусь за V4L2...или начну с просто V4L  - это действительно избавит от гемора с юзерской прогой (которую мне в общем то тоже надо было придумать). Только жалко уже существующие наработки...
Всем спасибо!
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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