|

Радиоперехват
Xakep, номер #036, стр. 036-052-2
D.J.: Напоминаю слушателям, что мы в 16-ричной системе исчисления.
Z.: ...Но заставить двигаться системное время медленнее, только программируя таймер, мы уже не сможем, так как 0FFFFh максимальное значение для регистра-счетчика. Вместо этого можно перехватить прерывание, которое соответствует IRQ0 (это аппаратное прерывание), для DOS 08h (это программное прерывание) и, например, циклически в первый раз передавать управление системному обработчику с последующим возвратом в прерванную программу, а в следующий раз произвести простой возврат из прерывания командой IRET. В первом случае происходит обновление системного времени, а во втором - нет, поэтому оно течет в два раза медленней.
D.J.: А как же в windows?
Z.: Ну, про Win2K разговор отдельный, я опишу 9x. C приходом операционной системы Windows, однако, все изменилось. Теперь операционка может менять начальное значение регистра-счетчика как ей вздумается в зависимости от потребностей прикладных задач.
D.J.: Это Гейтс во всем виноват...
Z.: Нет, он не виноват, хотя... Бог с ним. Ну вот, перепрограммированный нами таймер сохранит свое состояние только до первого обращения к нему операционной системы. Для изменения скорости течения времени нам необходимо также использовать перехват прерываний. В моем примере проглатывается каждое третье прерывание от таймера, то есть происходит возврат в прерванную программу без вызова системного обработчика.
D.J.: В вашем примере???
Z.: Я исходник принес с собой... Потом покажу...
D.J.: А!!! Sorry! Continue, plz!!
Z.: Следует помнить, что программа окажет влияния ТОЛЬКО на события, синхронизируемые по таймеру. Например, на скорость воспроизведение звука она не окажет никакого влияния, так как синхронизация идет не через таймер, а через DSP (Digital Sygnal Process) звуковой карточки.
В проге используется перехват прерывания INT3 для выхода на нулевое кольцо защиты. У этого прерывания DPL=3, то есть его можно вызывать с любым уровнем привилегий. VMM (Virtual Memory Managment) сервисом PageAllocate выделяем место в системной области памяти и пихаем... ммм... запихиваем... в общем, кладем туда наш обработчик прерываний от таймера. Так как каждое третье прерывание от таймера "теряется", то и процессор замедляется на треть.
Прога не будет работать на Windows NT/2k, так как прерывания там надежно защищены от перехвата прикладными программами... Пока...
D.J.: Что, простите!!?
Z.: Я в смысле руки не дотянулись до Win2K еще...
D.J.: Ясно.
Z.: Вот вам исходник.
D.J.: О, спасибо!!! Покажу жене, пусть тоже приобщается... Ну и на сайт выложим, конечно...
Z.: Да, чуть не забыл!!! Когда компильнете исходник, получите exe-файл...
D.J.: Не может быть! :))
Z.: ...который при повторном запуске снова замедлит процессор от уже оставшегося "быстродействия".
D.J.: Круто!!!
Z.: Ну у меня пока все.
D.J.: Благодарю вас за столь интересный рассказ! На следующей неделе мы вас обязательно еще пригласим для просвещения народа, о чем расскажете?
Назад на стр. 036-052-1 Содержание Вперед на стр. 036-052-3
|