Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с PCI в Win NT 5.0. Сервисы BIOS32 и их использование.  (Прочитано 21958 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Serhiy_UA
Интересующийся

ua
Offline Offline

« : 06-04-2010 06:39 » 

Приветствую всех!
Стоит задача по работе с PCI-платами в Windows XP. Проработал несколько источников, названия основных в конце этого поста, источник [1] у меня в pdf, а [2] в печатном виде.  

В [1] на стр.129 написано о функциях BIOS, доступных как в кольце 3, так и кольце 0. А на стр. 130 указано об использовании каталога 32-разрядных сервисов, в частности для «поиска устройства по идентификатору».
1. Кто-то использовал данные сервисы в Windows NT5.0, насколько это целесообразно?
2. Почему в [2] об этих сервисах ничего не сказано, ведь они, похоже, полезны?
3. Где можно подробней прочесть о работе с данными сервисами применительно к PCI устройствам?

Литература:
1. Гук М. Ю.  Шины PCI, USB и FireWire. Энциклопедия. — СПб.: Питер, 2005. — 540 с.
2. Солдатов В.П. Программирование драйверов Windows. Изд. 3-е, перераб. И доп. – М: ООО «Бином-Пресс», 2006 г. – 576 с.
« Последнее редактирование: 06-04-2010 11:29 от Serhiy_UA » Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 06-04-2010 11:36 » 

По книгам могу сказать следующее.
[1] я не читал.
[2] мне кажется вообще бесполезной книгой. По крайней мере, когда я ничего не знал о драйверах (кроме DriverEntry), то прочтение этой книги мне в практическом плане никак не помогло. Информация далеко не полная и подается в каком-то странном порядке. Как будто расчитана на тех, кто уже всё знает и умеет. Только для таких людей эта книга еще более бесполезна.

Лично мне из всеобъемлящих книг по драйверам, понравилась только книга У. Они (есть в списке литературы).

По сервисам BIOS. Честно говоря, не ясно о каких сервисах BIOS может идти речь в Windows NT 5.0 и выше, если задача написать драйвер для PCI устройства (да равно как и для любого другого). И уж тем более не понятно каким образом они доступны в 3м кольце. Может в [1] речь и не о windows вовсе ? В windows совсем другие методы.
Записан
Serhiy_UA
Интересующийся

ua
Offline Offline

« Ответ #2 : 06-04-2010 12:23 » 

[2] мне кажется вообще...
...жаль, но мне эта книга пока тоже не помогла. Может, действительно, потом, когда чему-то подучусь...

Гук М.Ю. в [1] пишет про Сервисы BIOS32, видимо, применительно к Windows.

Мне сейчас главное быстрей подступиться к своей PCI-плате. В ней раскрыто три BAR, но Солдатов В.П. ничего о работе с BAR не говорит. А где еще почитать, только лишь у У.Они?



 
« Последнее редактирование: 06-04-2010 12:26 от Serhiy_UA » Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 06-04-2010 12:32 » 

А где еще почитать, только лишь у У.Они?

Ну Они не сказать что конкретно про PCI пишет. Он о windows-драйверах вцелом, реально полезная книга, по сей день бывает заглядываю в нее.

Про PCI-девайсы не возьмусь ничего говорить. Это лучше дождаться ответа Ochkarik'а. Вот только чтоб получить конкретный ответ, нужно задать конкретный вопрос.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 06-04-2010 15:01 » 

Serhiy_UA,
какие конкретно функции BIOS вам нужны? перечислите, пожалуйста.
что у вас в BAR-ах? пространство I/O, отображаемая память? - для их использования вам не нужны функции BIOS. под windows совсем иные методы доступа к данным ресурсам.
найти свое устройство? - данная функция выполняется не вами а драйвером шины операционной системы. она его сама обнаружит, и только после этого вызовет вами написанный драйвер. вам просто не нужно будет знать где он физически находится - это задача драйвера шины.

я написал всего один драйвер для платы PCI хотя и с довольно монстроидной логикой(его исходник занимает пол мегабата  чистого Си-кода) но вполне корректно, судя по тому, что он вполне успешно портировался от Win98 до W2K, XP и Windows7.
так вот в его написании, я ни разу не использовал функции BIOS, и даже не представляю зачем они мне могут понадобится.
поэтому мой вам совет. изучите для начала структуру ядра Windows (я помоему вам это уже советовал). без ее знания вы не продвинитесь никуда.
уверяю вас, вопросы про использование BIOS у вас отпадут. по крайней мере в вашем случае я пока не вижу где они вам могут пригодится.
ну к примеру. допустим один из BAR-ов у вас отвечает за порты ввода-вывода. драйвер шины Windows сам его прочитает, и предоставит вашему драйверу информацию о том, что у вашей платы есть ресурс портов I/O с длинной такой-то.
есть BAR отвечающий за отображаемую память устройства - опять же драйвер шины его найдет, и выдаст вам информацию о том, что есть такое окно

я понимаю, что довольно сложно после работы в DOS-переключится на Windows, но деваться некуда. кроме того, к сожалению толковой литературы не так уж много.
посмотрите 9-тую главу Руссиновича "Подсистема ввода-вывода". это о общей структуре. там несколько в общем виде, но кое что полезное вы оттуда сможете  получить.

почитайте 6-ю главу Вальтера Они "поддержка Plug and Play для функциональных драйверов" (хотя Они лучше начинать читать с самого начала, с середины будет очень сложно понять)
(нумерация глав по тем редакциям этих книг, что у меня в бумажном варианте есть)

PS к сожалению улетаю в командировку до субботы.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Serhiy_UA
Интересующийся

ua
Offline Offline

« Ответ #5 : 07-04-2010 05:31 » 

Ochkarik и resource,
Спасибо за советы!
Я прочел В.Солдатова от первой страницы до последней, и удивился тому, что после прочтения книги ничего практически сделать не могу. Обычно хоть что-то получалось. В его книге [2] на стр.100 есть пример из драйвера "в стиле-NT" с ассемблерной вставкой для непосредственного обращения по адресам. Ну и еще М.Гук написал про эти сервисы, поэтому подумалось, что подобные ассемблерные вставки и эти сервисы помогут получить назначенные BIOS адреса из BARх, а потом через указатели в режиме ПДП выполнять к ним доступ, если не из 3-го, то своим драйвером из 0-кольца. По крайней мере, так я себя убедил после прочтения М.Гука.
По поводу книг У.Они и М.Руссиновича они у меня в электронном виде, попробую их распечатать и еще раз более внимательно прочесть. Тогда вопросы будут конкретней.
А в моей PCI-плате BAR0 и BAR1 отражаются на память по 32КБ, а BAR2 на пространство ввода/вывода.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 07-04-2010 08:52 » 

нет-нет, солдатов - это ужас) если уж что то читать от корки до корки - то только две книги:
1. Руссинович.
2. Вальтер Они.
причем даже не могу сказать в каком порядке лучше это делать...  обе книги - это самое лучшее что есть на русском. причем Руссинович поможет вам лучше ориентироваться в архитектуре ОС (это важно). Там очень удачно изложены главные моменты - взаимодействие между компонентами ОС, многозадачность, уровни привелегий, архитектура памяти ПК в защищенном режиме, переключение задач. без понимания этих принципов некоторые особенности архитектуры драйвера могут показаться непонятными и очень странными.
Вальтер - это уже ближе к делу, собственно архитектура WDM драйверов. там и примеры были и комментарии к ним.
В принципе, есть еще книга Пени Орвик, но она описывает обертку(фреймворк) над WDM - то что называется KMDF. Книга по своему неплохая, но базовые вещи в ней не описаны, поэтому для начинающих - это книга будет полной кашей. даже если наткнетесь на нее - повремените ее читать.

PS если не найдете примеров от книг, потерпите до конца недели - обязуюсь выложить диск с примерами от книги Вальтера Они(2007года) и Руссиновича (2000го).
а то в командировку опять заслали...

PPS по поводу BAR-ов. возмите в качестве базового драйвера - то что вам сгенерила NuMega. там мало лишнего, поэтому разбираться очень удобно. в частности вас для начала должна интересовать процедуры DriverEntry, AddDevice и dispatch-процедура обработки PnP запросов (IRP_MJ_PNP). на все остальное пока не обращайте внимания. смотрите какие функции там вызывались, читайте их описание на msdn, ищите их описание у Вальтера Они.
« Последнее редактирование: 07-04-2010 08:57 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
AndriAno
Интересующийся

ru
Offline Offline

« Ответ #7 : 27-04-2010 11:14 » 

Думаю в контексте идущего разговора нестоит создавать отдельную ветку.

Мною была поднята железка с плисиной на борту. Интерфейс связи PCIe. Есть 2 BAR(Memory). Требуемая скорость передачи потоковых данных порядка 1,6Гбит/с.
Отлажено чтение-запись по слову. Использовал JungoDriver. Теперь необходимо перейти к написанию полноценного драйвера KernelMode. Знания в написании драйверов самые начальные(Вальтера Они уже прочел, пример Грома скомпилил).

Теперь вопросы:

1. Шина PCIe работает по архитектуре PCI, соответственно работа должна произоводиться через PCIBusDriver. Так ли это?
2. Необходимо написание General Driver(прямого общения с платой) или есть возможность использования какогото промежуточного драйвера(написание минидрайвера или драйвера фильтра)?
3. В случае прямого общения с платой будут ли BAR отображаться в память??
4. Есть ли стандарт Scatter-Gather алгоритма? Поднимать его самому с обоих сторон или BusDriver его уже поддерживает?

Для начала хватит.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 27-04-2010 13:52 » 

Уолтера (может он и Вальтер, утверждать не возьмусь) Они видимо плохо почитали. Про Pnp надо читать внимательнее. Вся настройка ресурсов через это дело идет. Так же имеет смысл посмотреть этот форум, что-то на таком же уровне уже было (думаю что неоднократно).

ЗЫ Это всё-таки стоит вынести в отдельный топик
Записан
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #9 : 27-04-2010 14:19 » 

|| Отлажено чтение-запись по слову.
По слову (32-х битному) через PCIe не советую. Тормозно - порядка 2МБайт/сек на чтение и 8МБайт/с на запись (конечно, много от железки зависит..). Там на 4 байта полезной нагрузки формируется ещё около 6-ти байт хвостика последовательного TLP-пакета, плюс время на захватШины/запрос/ответ/готовность.
Рекомендую на JungoDriver прогнать тест скорости обмена с железом, а то как бы уже после всего не обнаружить, что программа затыкается на гигабитных скоростях.
Если скорость разочарует - то стоит переходить на бас-мастер режимы, когда железка сама пишет через шину. Частичным решением может быть использование для чтения/записи MMX/SSE регистров - но это ускорение всего в 2-4 раза.
« Последнее редактирование: 27-04-2010 14:24 от PredatorAlpha » Записан
AndriAno
Интересующийся

ru
Offline Offline

« Ответ #10 : 27-04-2010 17:24 » 

To resource.
Читал как мог, понял что сумел(опыта в этих вопросах почти никакого). Вот сюда с остальными вопросами и пожаловал. Про PnP еще раз ознакомлюсь. Сегодня уже поздно. Просто думал получить достаточно короткий ответ одно-два предложения. Вчера полдня этот форум и штудировал. Про работу с PCI довольно мало постов.

To PredatorAlpha:
А никто и не спорит что короткими транзакциями скорость не выжать. Вот и хочу на нормальные режимы переходить. А насчет скоростей, HardIP корка дает такие циферки: PCIe×1, 64-bit 220MB/s(DMA Read) 225MB/s(DMA Write). Для более быстрых режимов:PCIe×8, 128-bit 1497MB/s(DMA Read)  1775MB/s(DMA Write). Такчто железо тянет. А для запуска DMA в мастер мод и хочется подробнее узнать про Scatter-Gather, чтобы велосипед не изобретать.
"Частичным решением может быть использование для чтения/записи MMX/SSE регистров"  не совсем понял о чем идет речь? Транзакции из шины в регистры проца?? Если так, то не покатит. Объемы данных очень большие все равно в память скидывать придется.

Сейчас ведется одновременная работа над "железом"(алгоритм работы можно достаточно лего изменить) и написание полноценного драйвера.
Записан
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #11 : 27-04-2010 18:56 » 

// "Частичным решением может быть использование для чтения/записи MMX/SSE регистров"  не совсем понял о чем идет речь? //

Это я говорил на тот случай, если железка не поддерживает мастер... так что вопрос отпал.

///А насчет скоростей, HardIP корка дает такие циферки: PCIe×1, 64-bit 220MB/s(DMA Read) 225MB/s(DMA Write). Для более быстрых режимов:PCIe×8, 128-bit 1497MB/s(DMA Read)  1775MB/s(DMA Write). Такчто железо тянет. А для запуска DMA в мастер мод и хочется подробнее узнать про Scatter-Gather, чтобы велосипед не изобретать. ///

А может Вам не стоит заморачиваться со  Scatter-Gather?? Довольно геморойно для железятников.. Можно выделить непрерывный кусок памяти. С выделением 8М одним куском бывают проблемы.. но 2 буфера по 4М я думаю без проблем пойдут, тем более если Вам выравнивание неважно.  Если 4М хватит для Ваших нужд, то наверно лучше так, хотя решайте сами...
Кстати, учтите, что запросы на чтение посадят заявленную скорость записи раза в полтора.. да и при одновременном чтении/записи и скорость чтения тоже упадёт... так что закладывайтесь сразу на продвинутые режимы.
« Последнее редактирование: 27-04-2010 19:10 от PredatorAlpha » Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 27-04-2010 20:37 » 

AndriAno, я вот это всё писал не от того, что я тут такой "блатной" и пишу мол "читайте, читайте, и нечего спрашивать". Просто на первые два вопроса из поста #7 можно ответить с одной стороны да, а сдругой - нет. Философию разводить действительно не хочется, а информация вся в книге Они есть. Поэтому вы уж отнеситесь к этому не как к отмазке, а как к дельной рекомендации. Ваша тема PNP и обработка IRP_MN_START_DEVICE (если ошибся, меня поправят).
Записан
AndriAno
Интересующийся

ru
Offline Offline

« Ответ #13 : 28-04-2010 02:26 » 

PredatorAlpha
Насчет размера буффера. У меня поток 1,6Гбит/с, время реакции системы на прерывание (по оценкам форумчан) достигает 20 мс. В итоге получаю минимальный размер буфера 32 МБ. Как я понимаю такой объем (непрерывной) памяти совсем не гарантирован системой. Хотя кажется я встречал функции выделяющие с гарантией требуемый кусок памяти, но пользоваться ими не рекомендовали.
Вариант если после инициализации в управляющие регистры будут прописаны несколько BaseAddress с указанием длины буфера, меня в принципе устраивает.

resource
Книгу обязательно перечитаю. Доки, они всегда рулез. Но пока я читаю, может у когонибудь появиться желание пофилосовствовать.


PS. Мысли стороннего наблюдателя.
Большинство тем на этом форуме заканчиваются пожеланием прочитать литератутру. И читать доки надо.
PPS
Но вчем тогда смысл форума??
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 28-04-2010 03:00 » 

Цитата
Но вчем тогда смысл форума??

AndriAno, все, кто учился в ВУЗе и сумел выпуститься, этот вопрос не зададут Улыбаюсь Смысл учёбы в ВУЗе - научить учиться. Вот и на этом форуме пытаются не учить, а учить учиться.
Записан

AndriAno
Интересующийся

ru
Offline Offline

« Ответ #15 : 28-04-2010 03:43 » 

Алексей1153++
Учиться можно разными способами.

Первый способ: Взять документацию на стандарт, выучить её. Переложить на требуемую тебе задачу. Столкнуться с нестыковками в стандарте(как вариант багами), убить кучу времени на решение проблемы. Выполнить задачу.

Второй способ: Узнать может то что требуется сделать уже выполнено 1000 раз другими людьми. Посмотреть можно ли пременить их опыт и решения к поставленной задаче. Понять что 50 процентов стандарта поддерживать не требуется (из прошлого опыта, например, некоторые конструкции компилятор не поддерживает), а оставшиеся 50 уже написаный стандарт, лежащий в большинстве библиотек. И требуется только его небольшая доработка до требуемой задачи. Выполнить в итоге задачу.

Остальные варианты комбинации первых.

Просто както нехочется изобретать велосипед будучи новичком в данном вопросе.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 28-04-2010 04:07 » 

AndriAno,

учить документацию (или справочник) - пустая трата времени как раз ) На то они и справочники. Ими надо уметь пользоваться и иметь их под рукой

Второй способ - так кто ж против подсказать, показывай, где споткнулся. Если подсказывают, что прочитать - прочитай
Записан

AndriAno
Интересующийся

ru
Offline Offline

« Ответ #17 : 28-04-2010 04:30 » 

Алексей1153++, так я хотябы раз сказал что читать ничего не буду. После обеда время свободное появиться, сяду читать главу про пнп.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 28-04-2010 04:33 » 

AndriAno, смысл не в том чтобы пересказывать содержимое книг, а в том чтобы помогать решать вопросы, которые в книгах не подымаются. Возможно, помочь найти какую-то ошибку, или разобраться с каким-то конкретным кодом. Короче вопросы на которые можно ответить конкретно (и по возможности коротко).

ЗЫ неправда, что в большинстве топиков отсылают к литературе. Всё зависит от вопросов, которые задают.
« Последнее редактирование: 28-04-2010 04:39 от resource » Записан
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #19 : 28-04-2010 07:22 » 

PredatorAlpha
Насчет размера буффера. У меня поток 1,6Гбит/с, время реакции системы на прерывание (по оценкам форумчан) достигает 20 мс. В итоге получаю минимальный размер буфера 32 МБ. Как я понимаю такой объем (непрерывной) памяти совсем не гарантирован системой. Хотя кажется я встречал функции выделяющие с гарантией требуемый кусок памяти, но пользоваться ими не рекомендовали.
Вариант если после инициализации в управляющие регистры будут прописаны несколько BaseAddress с указанием длины буфера, меня в принципе устраивает.
Наверно, тогда таки Scatter-Gather. Несколько "кусков" тоже возможно, но всё-же Scatter-Gather правильнее. И перспективнее - в будущем наверно появится новое устройство, с большим размером памяти, и "кусковый" вариант будет кусаться.
Хотя решать, конечно, Вам.
Записан
Serhiy_UA
Интересующийся

ua
Offline Offline

« Ответ #20 : 30-04-2010 08:00 » 

...Использовал JungoDriver. Теперь необходимо перейти к написанию полноценного драйвера KernelMode...
к AndriAno
Хотел бы уточнить по поводу JungoDriver.
Jungo дает бесплатно лишь оценочный софт с ограничением по времени на месяц. Как Вы преодолеваете эти ограничения? Есть ли обходные пути?
Покупать этот софт пока возможности нет...

Пока предполагаю работать с PCI, а потом и с PCIe.
Записан
AndriAno
Интересующийся

ru
Offline Offline

« Ответ #21 : 05-05-2010 07:58 » 

Serhiy_UA, для первоначальной отладки железки мне вполне хватило оценочного времени.
Отладил чтение-запись по слову. Работу с потоками в Jungo не пробовал. Но как я понимаю там предоставляются драйвера  режима user-mode, что не совсем меня устраивает.
Сейчас сижу разбираюсь с WDK.

Посмотрите в сторону Driver Studio.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines