информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Где водятся OGRыАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 На GitHub пугают ложными предупреждениями... 
 Атака на пользователей больших... 
 Notepad++ полгода раздавал зараженные... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Re:Прерывания из драйвера 05.02.02 05:54  Число просмотров: 1269
Автор: dsds Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Для начала нужно определиться кто будет владеть разделяемой
> памятью:
> 1) Если драйвер, тогда нужно по IOCTL от пользователя
> делать отображение в его процесс. Это описано в Knowledge
> Base у MS и где-то на этом форуме. В крайнем случай я могу
> дать пример.
> 2) Если процесс пользователя, то драйвер должен получать
> доступ через Mdl, это описано в DDK. Пример есть на моем
> сайте, ExactPerfomance pseude device driver,
> http://leo-yuriev.narod.ru/dnet/LYEP-Sources.rar
Если не трудно, поясните:
А от чего зависит выбор владельца разделяемой памяти ? Это как-то влияет на скорость обработки, время реакции и тд. ? Память-то одна и та же в обоих случаях.
> Я так понял что требуется некая транзакционность изменений.
> Это можно сделать просто, имея в разделяемой памяти две
> копии данных, и делая InterlockedIncrement некого счетчика
> при каждом изменении. Младший бит счетчика будет
> индикатором активной "страницы".
Ситуация такая:
Приходит прерывание, в течении 15мс драйвер должен обновить 12КБ внешней буферной памяти, далее он должен уведомить приложение, чтобы оно положило в разделяемую память новые данные для след. цикла, через 30мс внешнее устройство читает буферную память, ждем след. прерывание, частота их следования 30Гц.
> Есть только один "подводный камень", на SMP
> (мультипроцессорных) машинах возможна ситуация, когда
> драйвер будет считывать данные параллельно с изменением.
> Обходится это просто:
> - в драйвере обработка производится в Dpc, для которого
> назначается affinity на один конкретный процессор;
> - тoт же affinity назначается thread-у в программе
> пользователя;
Нет, система однопроцессорная.
> Удачи!
Она-то и нужна :-)
> P.S.
> Если проект коммерческий и есть деньги, то я могу все
> сделать на заказ.
В том-то и дело, что некоммерчесский - модернизация оборудования в институте (переход с DOS-а на WinNT/2000), денег нет, приходится все самим делать :-(
<programming>
[Win32] Прерывания из драйвера 02.02.02 10:22  
Автор: dsds Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Кто с этим сталкивался. Подскажите как правильно уведомить пользовательское приложение о прерывании, которое пришло в драйвер, под WinNT/2000 ?
Т.е. есть железяка (порт на ISA-шине), в него приходят прерывания от внешних устройств, есть драйвер для него, нужно вставить реакцию на прерывания с возможно минимальным временем обработки.
[Win32] Re:Прерывания из драйвера 02.02.02 13:31  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
> Кто с этим сталкивался. Подскажите как правильно уведомить
> пользовательское приложение о прерывании, которое пришло в
> драйвер, под WinNT/2000 ?
> Т.е. есть железяка (порт на ISA-шине), в него приходят
> прерывания от внешних устройств, есть драйвер для него,
> нужно вставить реакцию на прерывания с возможно минимальным
> временем обработки.

Если использовать только стандартные средства, то так:

В драйвере:
1) Нужно создать "глобальное" именованное событие (event):
RtlInitUnicodeString(UnicodeEventName, L"\\BaseNamedObjects\\MyEvent");
IoCreateNotificationEvent(UnicodeEventName, &Handle);
ObReferenceObjectByHandle(Handle, EVENT_ALL_ACCESS, 0, KernelMode, (void**) &pMyEvent, 0);
KeClearEvent(pMyEvent);

2) Подготовить Deffered-процедуру и DPC объект:
KeInitializeDpc(&MyDpc, MyDefferedRoutine, pMyEvent);
void MyDefferedRoutine(KDPC *pDpc, void *pContext, void *Arg1, void *Arg2)
{
KePusleEvent((KEVENT*)pContext, 16, false);
}

3) Из InterruptServiceRoutine когда нужо вставлять Dpc в очередь:
BOOLEAN MyInterruptServiceRoutine(PKINTERRUPT Interrupt, void *pContext)
{
[...]
KeInsertQueueDpc(&( (MY_CONTEXT*)pContext)->MyDpc, 0, 0);
[...]
}

В программе:
hMyEvent = OpenEvent(SYNCHRONIZE, false, "MyEvent");
WaitForSingleObject(hMyEvent, ...);

Но это не real-time обработка, т.е. от прихода прерывания до старта потока следящего за событием может пройти довольно много времение (до ~10ms) . Если процесс (и thread) пользователя будет иметь realtime-приоритет, и не будет конкурировать за время процессора с другими realtime-процессами, то время реакции будет достаточно быстрым (два переключения конекста и один запуск планировщика < 100 mks).

Если нужно бысрее, то есть три выхода:
1) Выполнять необходимые действия в драйвере, в InterruptServiceRoutine или DefferedProcedure;
2) Использовать Real-time расширения сторонних производителей;
3) Использовать QNX;

Удачи!
[Win32] Re:Прерывания из драйвера 02.02.02 16:15  
Автор: dsds Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Но это не real-time обработка, т.е. от прихода прерывания
> до старта потока следящего за событием может пройти
> довольно много времение (до ~10ms) . Если процесс (и
> thread) пользователя будет иметь realtime-приоритет, и не
> будет конкурировать за время процессора с другими
> realtime-процессами, то время реакции будет достаточно
> быстрым (два переключения конекста и один запуск
> планировщика < 100 mks).
>
> Если нужно бысрее, то есть три выхода:
> 1) Выполнять необходимые действия в драйвере, в
> InterruptServiceRoutine или DefferedProcedure;
Большое спасибо за информацию.
Строго говоря, нужно с частотой 30Гц обновлять 12Кб памяти во внешнем устройстве через этот порт, причем эти 12Кб могут быть изменены в любой момент времени (в пределах 30Гц) пользовательским приложением, можно ли в таком случае использовать расшаривание памяти типа:
SystemVirtualAddress = MmAllocateContiguousMemory(NumberOfBytes, HighestAcceptableAddress);
- как советует MS ? Как тогда быть с синхронизацией, т.е если приложение будет писать в эту память, а драйверу потребуется читать из нее ?
[Win32] Re:Прерывания из драйвера 02.02.02 20:35  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
> Большое спасибо за информацию.
> Строго говоря, нужно с частотой 30Гц обновлять 12Кб памяти
> во внешнем устройстве через этот порт, причем эти 12Кб
> могут быть изменены в любой момент времени (в пределах
> 30Гц) пользовательским приложением, можно ли в таком случае
> использовать расшаривание памяти типа:
> SystemVirtualAddress =
> MmAllocateContiguousMemory(NumberOfBytes,
> HighestAcceptableAddress);
> - как советует MS ? Как тогда быть с синхронизацией, т.е
> если приложение будет писать в эту память, а драйверу
> потребуется читать из нее ?

Для начала нужно определиться кто будет владеть разделяемой памятью:
1) Если драйвер, тогда нужно по IOCTL от пользователя делать отображение в его процесс. Это описано в Knowledge Base у MS и где-то на этом форуме. В крайнем случай я могу дать пример.
2) Если процесс пользователя, то драйвер должен получать доступ через Mdl, это описано в DDK. Пример есть на моем сайте, ExactPerfomance pseude device driver, http://leo-yuriev.narod.ru/dnet/LYEP-Sources.rar

Я так понял что требуется некая транзакционность изменений. Это можно сделать просто, имея в разделяемой памяти две копии данных, и делая InterlockedIncrement некого счетчика при каждом изменении. Младший бит счетчика будет индикатором активной "страницы".
Есть только один "подводный камень", на SMP (мультипроцессорных) машинах возможна ситуация, когда драйвер будет считывать данные параллельно с изменением. Обходится это просто:
- в драйвере обработка производится в Dpc, для которого назначается affinity на один конкретный процессор;
- тoт же affinity назначается thread-у в программе пользователя;

Удачи!

P.S.
Если проект коммерческий и есть деньги, то я могу все сделать на заказ.
[Win32] Re:Прерывания из драйвера 05.02.02 05:54  
Автор: dsds Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Для начала нужно определиться кто будет владеть разделяемой
> памятью:
> 1) Если драйвер, тогда нужно по IOCTL от пользователя
> делать отображение в его процесс. Это описано в Knowledge
> Base у MS и где-то на этом форуме. В крайнем случай я могу
> дать пример.
> 2) Если процесс пользователя, то драйвер должен получать
> доступ через Mdl, это описано в DDK. Пример есть на моем
> сайте, ExactPerfomance pseude device driver,
> http://leo-yuriev.narod.ru/dnet/LYEP-Sources.rar
Если не трудно, поясните:
А от чего зависит выбор владельца разделяемой памяти ? Это как-то влияет на скорость обработки, время реакции и тд. ? Память-то одна и та же в обоих случаях.
> Я так понял что требуется некая транзакционность изменений.
> Это можно сделать просто, имея в разделяемой памяти две
> копии данных, и делая InterlockedIncrement некого счетчика
> при каждом изменении. Младший бит счетчика будет
> индикатором активной "страницы".
Ситуация такая:
Приходит прерывание, в течении 15мс драйвер должен обновить 12КБ внешней буферной памяти, далее он должен уведомить приложение, чтобы оно положило в разделяемую память новые данные для след. цикла, через 30мс внешнее устройство читает буферную память, ждем след. прерывание, частота их следования 30Гц.
> Есть только один "подводный камень", на SMP
> (мультипроцессорных) машинах возможна ситуация, когда
> драйвер будет считывать данные параллельно с изменением.
> Обходится это просто:
> - в драйвере обработка производится в Dpc, для которого
> назначается affinity на один конкретный процессор;
> - тoт же affinity назначается thread-у в программе
> пользователя;
Нет, система однопроцессорная.
> Удачи!
Она-то и нужна :-)
> P.S.
> Если проект коммерческий и есть деньги, то я могу все
> сделать на заказ.
В том-то и дело, что некоммерчесский - модернизация оборудования в институте (переход с DOS-а на WinNT/2000), денег нет, приходится все самим делать :-(
[Win32] Re:Прерывания из драйвера 05.02.02 09:30  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка>
> Если не трудно, поясните:
> А от чего зависит выбор владельца разделяемой памяти ? Это
> как-то влияет на скорость обработки, время реакции и тд. ?
> Память-то одна и та же в обоих случаях.
Скорость от этого не зависит, делайте как вам удобнее.

> Нет, система однопроцессорная.
Советую сделать сразу, а то потом приется переделывать :-)
[Win32] Ясно, спасибо большое 06.02.02 10:36  
Автор: dsds Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach