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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов из Kernel mode кода расположенного в UserMode  (Прочитано 28008 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Rulik
Помогающий

ru
Offline Offline

« : 08-11-2005 03:32 » 

Добрый день.

Ситуация такая:
 В режиме ядра сиди драйвер, он через определенные интервалы времени должен вызывать код из User режима.
 Как сие можно сделать и вообще возможно ли это.
 Небходимо ето для того чтобы обойти диспетчер, А то в случае с большой нагрузкой на процессор, он может отобрать время у потока.

 В общем по русски надо чтоб код из User-mode вызывался в реальном времени. И задержки от момента возникновения события до его обработки
было минимальным и фиксированным.

А может я слишком много хочу от винды? Ангел
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #1 : 08-11-2005 08:05 » 

Врядли это тебя спасет. Вся юзер память расположена в PagedPool области, что не дает возможности ею пользоваться на высоких уровнях IRQL. Чтобы оградить себя от шидулинга распределения времени нада поднять свой IRQL до DISPATH_LEVEL, на котором работа со страничной памятью запрешенна.
Как вариант перенеси критическую работу в драйвер и там поднимай уровень до DISPATH_LEVEL и пользуйся NonPagedPool либо из юзер мода используй RealTime приоритет.
Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #2 : 09-11-2005 02:22 » 

Дело в том, что задача решена в UserMode с приоритетом TimeCritical, но при нагрузке на процессор все падает. Т.е. временные интервалы расползаются. Даже если само окно программы начинаешь таскать по рабочему столу, то интервалы начинают плавать приблизительно от -10..120мс до +8..45мс при допустимом отклонении +-1мс.
Вот я идумаю как извратится.
Перенести код в драйвер сложновато. Я работаю с микрухой FT245BM а у нее свой драйвер значит прийдется как-то к нему аттачится, и выяснять стандартные пакеты.
Т.к. драйвер идет еще и с DLL UserMode которая всем заправляет.

Может есть другие идее?
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #3 : 09-11-2005 08:56 » 

Врядли в User_Mode получится что то выжать.
Очень много всего выполняется в системе на уровне выше PASSIVE_LEVEL, отложенные процедуры, обработчики прерываний и.т.д.
Вариант хоть немного выжать для себя времени это поднять уровень до DISPATH_LEVEL и оставаться там в критические моменты времени  - но в этом случае, если мы там долго задержимся, мы как бы останавливаем планировщик потоков. Если машина двух и более процесорная, то все не так уж плохо.
Windows это система не реального времени - так что от нее это получить легальным способом не выйдет. Как вариант раскопать dll - посмотреть какие IOCTL команды отправляются драйверу микрухи и отправлять их из драйвера. !! НО если наш уровень будет DISPATH_LEVEL а микрушный драйвер это не учитывает - то возможен BSOD! Кстати если идет интенсивный обмен данными с драйвером и юзер модом, очень много процесорного времени тратится на переход из юзер мода в кернел. Можно раскопать спецификацию микрухи, ее порты, адреса I/O и самому написать драйвер по обмену информацией - это не проше, но зато будет работать на кринических участках кода.

Записан
Ochkarik
Модератор

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

« Ответ #4 : 09-11-2005 11:53 » 

Дело в том, что задача решена в UserMode с приоритетом TimeCritical, но при нагрузке на процессор все падает. Т.е. временные интервалы расползаются. Даже если само окно программы начинаешь таскать по рабочему столу, то интервалы начинают плавать приблизительно от -10..120мс до +8..45мс при допустимом отклонении +-1мс.

что ж вы хотите от виндов то...) по умолчанию квант времени который отводится потоку - 6=60мс,  если он не освододит его раньше, или если не появятся потоки с большиам приоритетом. и это на пассив-левел.
а вы хотите еще и окошки перетаскивать!...Не понял)))  не хватит никакой производительности.
кстати если в потоке функция ожидания любого объекта стоит- в случае успешного выполнения вычитает единицу из кванта...- учесть стоит. а если поток таймкритикал - вообще остаток кванта сбрасывает)
...
это я только что книжек умных начитался) Руссиновича. как раз по этой теме)

можете еще попробовать переключить систему на использование длинных квантов (=12), но наврядли это поможет...

кстати FT245BM - это кто такой?)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dachny
Гость
« Ответ #5 : 09-11-2005 12:08 » 

>>кстати FT245BM - это кто такой?)
Это visualbasic от электороники
г..но это вот

сначала хватаются за халяву типа и дрова писать не надо и фирваре к контролеру и ввобще даже думать не надо как тама USB  работает
а потом начинаются грабли вот такого вот плана
причем в 95 процентов случаев

И если грабли удается обойти то получаются уродцы как в програмировании так и в схемотехнике
с нулевой производительностью
с ужором проца в 100%
с глюками причем не только со своими
обсолютно не сопровождаемое

а надо то было ...  ладно не буду
Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #6 : 10-11-2005 02:37 » 

>>кстати FT245BM - это кто такой?)
Это visualbasic от электороники
г..но это вот


А чем тебе микруха ненравится?
Ты можешь сделать лучше?

И давайте не будем кричать что вон то лажа, а это круть. Тема не об этом.
Микруха работает просто замечательно и поддержка неплохая. (Просто надо уметь работать)

А на тему:

сначала хватаются за халяву типа и дрова писать не надо и фирваре к контролеру и ввобще даже думать не надо как тама USB  работает
а потом начинаются грабли вот такого вот плана
причем в 95 процентов случаев

И если грабли удается обойти то получаются уродцы как в програмировании так и в схемотехнике
с нулевой производительностью
с ужором проца в 100%
с глюками причем не только со своими
обсолютно не сопровождаемое

Я работаю в НПО "Автоматика" и люди здесь имею ни одну докторскую. И ты считаешь неправильно, что они пришли к выводу, что незачем заморачивать голову и разбиратся в тонкостях реализации USB. Я рад, что ты разбираешся в тонкостях USB. И насчет загрузки процессора, приложение съедает мене 1% от проца.
А грабли везде разложены. И форумы призваны помогать их обходить.

И еще раз повторюсь ТЕМА не о том ЧТО Г..НО, а что нет!!!

Если кого обидел, приношу свои извинения.

Просто хочется видеть реальные ответы по теме, а не очередную демогогию.
Которой полны форумы в инете и от которой уже тошнит!.
« Последнее редактирование: 10-11-2005 02:41 от Rulik » Записан
dachny
Гость
« Ответ #7 : 10-11-2005 06:50 » 

>>А чем тебе микруха ненравится?
Если бы они задокументировали ендпоинты что позволило бы самому к ней дрова написать цены бы ей не было

>>Ты можешь сделать лучше?
Для конкретной задачи я всегда сделаю лучше чем это будет сделано на FT245BM


>> Я работаю в НПО "Автоматика" и люди здесь имеют не одну докторскую.
>>И ты считаешь неправильно, что они пришли к выводу, что незачем заморачивать голову и разбиратся в тонкостях реализации USB
А зачем разбираться в тонкостях как работают КОНКРЕТНЫЕ ВЕЩИ. Не барское ето дело. Докторские строчить ето куда прикольние.


>> И насчет загрузки процессора, приложение съедает мене 1% от проца.
А разве не было разговоров про приоритеты TimeCritical


>> Просто хочется видеть реальные ответы по теме
Переехать на документированный контроллер и написать к нему фирмваре и дров


Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #8 : 14-11-2005 02:16 » 

Dachny.
 
 Я не говорю, что у меня не хватает процессора. Мне нужны интервалы времени с точностью до 1мс. Просто таймер который доступен из юзер моде
слишком не стабилен. И WaitFor...Object(...) может вернуть управление как на 1-5 мс раньше, а может и на 1..20 мс позже. Вот в чем проблема.
Вот я и пытаюсь написать драйвер, который даст стабильный таймер. Отсюда и ворос "Можно ли из Kernel Mode вызывать код в User Mode?"
А может есть способы и попроще сделать ето (высмысле таймер).
Записан
dachny
Гость
« Ответ #9 : 14-11-2005 08:13 » 

>>Отсюда и ворос "Можно ли из Kernel Mode вызывать код в User Mode?"

скажу честно МОЖНО. Из кенела можно запустить user mode процесс например

и добавлю
вот ету проблему:
>> Мне нужны интервалы времени с точностью до 1мс
ЭТО НЕ РЕШИТ

Записан
npak
Команда клуба

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

« Ответ #10 : 14-11-2005 08:13 » 

Rulik,

дело не в таймере, а в планировщике.  Windows - не realtime система, поэтому пользовательский поток пробуждается планировщиком только в свободное от работы время.  Даже если таймер будет срабатывать с наносекундной точностью, управление обычному потоку будет передано не мгновенно, а с задержкой в 1-20 мс или более (на сильно нагруженной системе).  Интервал между срабатыванием таймера и пробуждением потока можно сократить, подняв приоритет ждущего потока.

Более точные срабатывания таймера (по слухам), реализованы в timer queue.  CreateTimerQueue создаёт очередь таймеров, CreateTimerQueueTimer создаёт таймер, который будет вызывать функцию пользователя в специальном потоке с заданным интервалом времени.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Ochkarik
Модератор

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

« Ответ #11 : 14-11-2005 09:58 » 

CreateTimerQueueTimer - НЕ поможет.
точности 1 мс в юзермоде добится ИМХО нереально, - рано или поздно произойдет вытеснение потока на неоределенное время, и в этот момент будет пауза на порядки больше 1мс. а вытеснение потока произодйет непременно...
выход который могу предложить - если для готового драйвера расписаны его IOCTL-ы - писать драйвер фильтр, который будет заниматься обработкой и вызывать IOCTL готового драйвера... - это с заданной точностью можно попробовать реализовать, да и то - я бы не гарантировал... и даже на DISPACH_IRQL!!!, который у вас будет от системного таймера - он тоже с точностью до 1мс задается, а дальше +/- трамвайная остановка... (при том что потоки Диспач- не вытесняются переключением потоков...)
Кроме того - не факт что IOCTL готового драйвера можно вызывать на DISPACH_IRQL! скорее всего только на PASSIVE_IRQL - когда может так же произойти переключение потоков...

PS вызов юзермоде... где то читал об етом... ща вспомню... напишу...

PPS наврал!!! - 100нс таймер драйвера... - может сработать... если готовый драйвер на DISPATCH возможно вызвать. что вряд ли.
 кстати... а кто запрещает код юзера вызывать? можно влоб попробовать... тока обязалово на PASSIVE_IRQL.
« Последнее редактирование: 14-11-2005 10:16 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
npak
Команда клуба

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

« Ответ #12 : 14-11-2005 10:17 » 

Есть ещё Windows Multimedia Timers
В MSDN сказано, что предельное разрешение 1 миллисекунда
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Ochkarik
Модератор

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

« Ответ #13 : 14-11-2005 10:25 » 

там не сказано что оно гарантированное  Жаль
и с вызовом юзер-моде из кернел напрямую я наверное погорячился  Молчу
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dachny
Гость
« Ответ #14 : 14-11-2005 10:52 » 

>> и с вызовом юзер-моде из кернел напрямую я наверное погорячился
а как же RtlCreateUserProcess
Записан
Ochkarik
Модератор

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

« Ответ #15 : 14-11-2005 11:13 » 

RtlCreateUserProcess ? это где вы такой нашли?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dachny
Гость
« Ответ #16 : 14-11-2005 11:54 » 

>>RtlCreateUserProcess ? это где вы такой нашли?
в ntdll
ею винда winlogon.exe запускает из кернела между прочим
Записан
Ochkarik
Модератор

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

« Ответ #17 : 14-11-2005 14:06 » 

классно.... тока я в ДДК ни описания ни определения не обнаружил...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
IRP
Постоялец

ua
Offline Offline

« Ответ #18 : 14-11-2005 15:20 » 

А ты считаешь что ребята из MS в DDK все недокументированные и неэкспортируемые функции включить должны были? Если интересно как работает погляди в серцах винды Ага
Записан
Ochkarik
Модератор

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

« Ответ #19 : 14-11-2005 15:57 » 

хорошо бы!!! Молчу
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Rulik
Помогающий

ru
Offline Offline

« Ответ #20 : 15-11-2005 02:43 » 

Догда неувязока получатся.
Ведь библиотека реального времени RTX ставится под винду и работат както!!!
(Я бы использовал ее, но ... начальство ... экономия ... и тд и тп)
Записан
dachny
Гость
« Ответ #21 : 15-11-2005 07:51 » 

>>Ведь библиотека реального времени RTX ставится под винду и работат както!!!
>>(Я бы использовал ее, но ... начальство ... экономия ... и тд и тп)



я думаю для решения Вашей задачи хватит бесплатного DDK
и нормально документированного usb контроллера
Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #22 : 17-11-2005 02:33 » 

2 dachny

А что если перенести критически важный код в драйвер. Его загнать на уровень DISPACH_IRQL и завести таймер KeSetTimerEx, и ждать на етом уровне срабатывание таймера. А в ето время планировщик продолжает свою работу (наверное), таймер сработал я обменялся. И снова стою у таймера. И так в цикле я периодически буду вытеснять планировщик на 10-20мс.
Возможно ли такое?
Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #23 : 17-11-2005 02:36 » new

Может есть вариант через недокументированные функции "поиметь" (да простят меня модераторы) планировщик в шедевре мальчика Билли?
Записан
dachny
Гость
« Ответ #24 : 17-11-2005 05:45 » 

>>А что если перенести критически важный код в драйвер
иммено так и нужно сделать
А именно
Перенести весь код реализующий логику работы с устройством (ПОСТРОЕННОМ НЕ НА FTDI А НА НОРМАЛЬНО ДОКУМЕНТИРОВАНОМ КОНТРОЛЛРЕ) в кернел мод, А имменно в драйвер этого устройства
Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #25 : 17-11-2005 06:38 » 

2 dachny
Если несложно можешь поделиться на каком контроллере ето можно сделать?
Если не трудно кинь на мыло rulik00@bk.ru доки по этому контроллеру.
Записан
dachny
Гость
« Ответ #26 : 17-11-2005 08:43 » 

ну например http://www-s.ti.com/sc/ds/tusb3210.pdf
Записан
Ochkarik
Модератор

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

« Ответ #27 : 17-11-2005 10:17 » 

Гы)))) не было у бабы заботы - купила баба порося)
 Жжешь
записываюсь в клуб FTDI... ща буду с ней копаться) с такой же...
есть отладочный модуль с амтелом DLP-USB245M и наша железка... в ближайшее время посмотрим сего он может а чего нет... будет информация - выскажусь... Отлично
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #28 : 29-11-2005 11:55 » 

высказываюсь... драйвер родной дравйер эмуляции ком порта - гАвно. (думаю что и библиотека ...х200? - то же самое)
можно написать свой на нумеге за пол часа...)

но мне наш девайс не дали, времени нет - им хватило и родного, 600кб прокачивает... а отладочный кит - юзать лениво, он сам данные отдавать не умеет)
так что мои изыскания откладываются, временно...
единственное что сделал - нумеговскую рыбу, на чтение и запись... и те и те запросы проходят без ошибок, но надо мониторить еще поля пришедших пакетов, а для этого источник данных нужен... формат судя по всему примитивнный...один-два байта заголовка что ли плюс данные? но в этом шибко не копался...
на опыты ушло часа два неспешной возни)
 Жжешь
а микруха вроде ничего... драйвера ток Г. но это не у них одних такое)
займусь еще как-нибудь... как тока уломаю железячников пилу туда вписать... и индикатор подключить...
а мукруха ребятам понравилась в целом...
« Последнее редактирование: 29-11-2005 12:00 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines