Такой вопрос: если от устройства (ISA) поступило прерывание в момент, когда обработка предыдущего прерывания не закончилось (контроллеру прерываний еще не послали сигнал конца прерывания), то вновь поступившее прерывание проигнорируется или встает в очередь? А что будет если в момент обработки одного прерывания поступит несколько прерываний от устройства? Вопрос возник при организации запуска DOS-приложения, которое работает с железом напрямую из под Win2000/XP. Сейчас при сильной загруженности девайса приложение его "теряет". Как ведет себя виртуальная DOS-машина, если в VDM-драйвере генерировать прерывания в момент, когда обработка предыдущего прерывания еще не закончена?
Mantrid Книжки надо читать. Напрямую из DOS под Windows так не бывает. Есть понятия преоритет прерывания. Прерывания может перебить другое прерывание.А может остаться весеть в очереди пока не закончится другое прерывание, есть риск потерять прерывания.
Mantrid как ты обрабатываешь это прерывание ? под ntvdm орудует vdd, который осуществляет трэппинг прерывания или обращения к определённым портам. Поскольку ntvdm процесс тоже процес и тоже квантуется, то сам подумай, будут ли прерывания своевременно обрабатываться. К тому же нет гарантии, что vdd ведёт себя правильно. Лучши выход, пиши драйвер под nt, либо добавляй свою isr в очередь существующих. тогда есть гарантия что всё будет работать.
Бывает, читал DDK Аппаратное прерывание перехватывает драйвер режима ядра (под NT), дальше он передает его драйверу VDM (через объект Event). Драйвер VDM делает VDDSimulateInterrupt. Если устройство сильно не нагружать то все работает (машинка Celeron 366). Похоже прерывания теряются из-за того что пока работает VDDSimulateInterrupt, то тред, в котором все это крутится на внешние события не реагирует. Попробую разделить его на 2 треда, один - получает события о начале прерывания, другой делает VDDSimulateInterrupt. Еще вапрос: VDDSimulateInterrupt работает синхронно? До какого момента он ждет: до команды IRET или пока виртуальному контроллеру VDM не дадут сигнал конца прерывания? А если я перехвачу порт 20h в VDM, виртуальный конроллер прерываний VDM будет работать после этого? Насчет неправильного поведения VDM ты прав, VDM не правильно обрабатывает команды ввода\вывода, использующие сегментный регистр ES (даже в Windows XP SP2!!!). Этот косяк удалось обойти, но способ очень извращенный....
Знаешь, на твоём месте даже заморачиваться не стал бы. Подменил бы дескриптор в idt, сделал свои дела и отдал дальше. Это проще, хотя не совсем правильна. Единственная проблема только в MPS, но разве это проблема? мутить с isr и vdd это правильно, но на оперативность и достоверность не расчитывает. Собираешь статистику в буфере драйвера.Потом сделай свой VDD, это либа обыкновенная, организовываешь интерфейс с VDM и пусть твоё дос приложение этот буфер читает. Хотя, у тебя исходники то есть доспроги?=)
VDDSimulateInterrupt работает синхронно? по логике вещей когда твое досприложение получит конечное прерываение ? когда NTVDM подключится к планировщику, естессно что прерывания сево события ожидать не будут. Вот и думай.
Работать напрямую с IDT условия задачи не позволяют, на машине еще хуча всяких экзотических драйверных надстроек стоит. Применение данного способа может дестабилизировать сиситему (имно). Что такое MPS? не встречал в DDK... Мутить с isr и vdd советуют в DDK, там и пример есть на эту тему, типа звук и com/lpt порты в NTVDM так работают, вроде даже без косяков . Я по этому пути и пошел, мой случай не сильно отличается от портов. Исходников проги нет, иначе перевел бы ее под win32 и не мучался. Единственный выход - создание программе полной иллюзии работы под дос...
Если кому интересно, после долгих зловещих экспериментов мне удалось заствить DOS приложение стабильно работать с железом напрямую из под Windows 2000/XP (звучит как полная ересь, я и сам недавно думал, что это невозможно... ачуметь :-O ). Для этого пришлось переработать алгоритм передачи прерываний дос-приложению и повысить приоритет NTVDM до realtime... С realtime как-то не очень красиво получилось, буду рад услышать любые предложения. PS: да, я извращенец