The OpenNET Project / Index page

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

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

"bus_dma во FreeBSD"  
Сообщение от pvl email(ok) on 07-Мрт-07, 01:43 
вопрос к уважаемым гуру кернела фрей. 6.1

вопрос.. он громадный будет так что если кто просто на литературу толковую ссылку даст то уже буду премного признателен.
собсно.. немогу я раздуплится в использовании bus_dma... framework.

есть у меня железка PCI-ная, умная немеряно. для ее работы в памяти нужно выстроить list из структур дескрипторов типа
struct descr
{
    WORD32        info1;
    struct descr* next_descr;
    BYTE*         data;
    WORD32        info2;
}
затем пихнуть железке указатель на первый дескриптор в листе, и она сама пойдет на основе info1,info2 и указателей выгребать данные из памяти.
вобщемто я понял примерно что bus_dma_tag_create подготавливает виртуальную машину к тому что будет выделятся память под ДМА и там главное указать размер участка и кол-во сегментов в нем.

затем bus_dmamem_alloc выделяет буфер и возвращает указатель на него.

а потом можно bus_dmamap_load'ом загружать в этот буфер данные и по калбеку вываливатся в процедуру, один из параметров которой - физический адрес буфера.

(это я так из скудной найденой инфы понял.. може и не совсем правильно)

теперь начинается полная каша. bus_dmamem_alloc принмает bus_dma_tag_t и возвращает указатель на буфер и bus_dmamap_t. bus_dmamap_load берет таг, мап и указатель на буффер и лоадит его в область ДМА. bus_dmamap_unload берет только таг и мап.
т.е. - можно загружать несколько буферов (я так и делаю), но выгрузка будет только для всей области целиком?????

я попробовал выделить буфер размером с 1000 дескрипторов (типа пул сделать) и все их связал в очередь. ну и забираю дескрипторы из головы а возвращаю потом в конец.
вот тут и возникает главный вопрос -
допустим я сделаю
bus_dmamap_load(v_tag, v_map, dsc_1, sizeof(struct descr), c_func, c_arg, 0);
потом
bus_dmamap_load(v_tag, v_map, dsc_2, 3*sizeof(struct descr), c_func, c_arg, 0);
bus_dmamap_load(v_tag, v_map, dsc_3, 10*sizeof(struct descr), c_func, c_arg, 0);

dsc_1 - один дескриптор взятый из пула
dsc_2 - 3 дескриптора связаных в очередь
dsc_3 - 10 --^^^^^^^^^^^^^^^^^^^^^^^^^^^^

все они загрузятся по разным физ адресам (проверял).. вот только вопрос как выгрузить использованый дескриптор и вернуть его в пул???????
т.е. чисто алгоритмически понятно - просто добавить использованые дескрипторы в хвост, но вот как это обрабатывает bus_dma я не пойму. что будет когда я при загрузке в dmamap дойду до конца пула и перейду к первому "возвращенному" дескриптору??????

вобщем допоможите чем сильны.
заранее спасибо

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

 Оглавление

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


1. "bus_dma во FreeBSD"  
Сообщение от dma (??) on 08-Мрт-07, 09:17 
что мешает заглянуть в соурсы OS?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "bus_dma во FreeBSD"  
Сообщение от pvl email(ok) on 08-Мрт-07, 19:38 
>что мешает заглянуть в соурсы OS?

о..
как всегда ответ человека который не шарит, и ответ НИОЧЕМ.

слепой я вот такой, сырцов в бинокль не наблюдаю... :)))

смотрел я все. самое близкое по духу - сетевые интерфейсы. аля rl, nve, fxp. примитивно там все до ужаса. и немогу я в сырцах найти примеры всех приемов работы с фрамеворком ДМА'шным.
иначе не задавал вопросы бы.

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

3. "bus_dma во FreeBSD"  
Сообщение от dma (??) on 09-Мрт-07, 04:57 
>>что мешает заглянуть в соурсы OS?
>
>о..
>как всегда ответ человека который не шарит, и ответ НИОЧЕМ.
  нет нужды тратить на вас время
>
>слепой я вот такой, сырцов в бинокль не наблюдаю... :)))
>
  cd /usr/src

>смотрел я все. самое близкое по духу - сетевые интерфейсы. аля rl,
>nve, fxp. примитивно там все до ужаса. и немогу я в
>сырцах найти примеры всех приемов работы с фрамеворком ДМА'шным.
>иначе не задавал вопросы бы.

зачем примеры?
вам нужно понять как ОНО работает
вот и посмотрите src/sys/i386/i386/busdma_machdep.c
все нормально расписано

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

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

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




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

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