Что будет если дать команду cli из под ring0? Приведет ли это к запрету всех прерываний? Я тут подумал что так можно повысить производительность программы(процессор после cli не реагирует на прерывание от таймера и не переключается на другие задачи и даже потоки). Кроме того помогает точно замерить время выполнения кода или инструкции.
TempINT dd 0 ;============================ ; Запрещаем прерывания ;============================ cli mov eax,cr0 and eax,0xFFFEFFFF mov cr0,eax mov dword ptr [TempINT], eax ;============================ ; Возвращаем все на место ;============================ mov eax, dword ptr [TempINT] mov cr0, eax sti
Vilco Код (Text): ; ;Запрет прерываний (в том числе NMI) ; cli in al, 70h or al, 80h out 70h, al можт лучче так: да и при чем wp-bit к запрету прерываний?
Вообще-то NMI и прочие "необычные" прерывания особого резона запрещать нет: они возникают только в очень специфических условиях, а не при нормальном функционировании компутера.
Йа вот тут такую фишку придумал:пишем драйвер который предоставляет возможность запрещать и разрешать прерывания. Затем в риг3 посылаем IOCTL драйверу,он запрещает прерывания наш код выполняется с повышенной производительностью и затем через дпрайвер разрешаем прерывания.
KingT Только эта "фишка" позволит программе пользовательского режима нарушить работу всей системы в целом. Например, она запретит прерывания и благополучно зависнет. Что делать-то будете? Только ресет или отключение питания и остаётся
KingT Если программа серьёзная, то доказать её правильность, а значит, и невозможность нештатного поведения, невозможно. А поднимать производительность вычислителя квадратных уравнений нет смысла. Кстати, если полностью запретить прерывания, станет невозможно параллельно слушать музыку, записывать СД/ДВД и т.д. -- в общем, делать всё то, что требует быстрой реакции системы на прерывания.
И будет это страшно глючным.. Если запретить прерывания через cli, то контекст все равно будет принудительно переключен при вызове некоторых винапи, преимущественно ожидающих (WaitForSingleObject, ...), т.к. поток при этом отправляется в State==Waiting и система найдет следующий. При этом прерывания, насколько я помню, разрешатся и фсио) а если ты irql поднимешь выше apc level, вообще скорее всего всё закончится BSoD'ом =) Вообще, ринг3 приложения не должны иметь возможность прибить работу всей системы. Это неправильно
Прерывания существуют не для того, чтобы их запрещать. Запрет прерываний -- это КРАЙНОСТИ, которые нужны только в строго определенных случаях. Запрещать прерывания длительное время НЕЛЬЗЯ. В системе есть куча железок, запросы которых должны быть вовремя обработанны процессором, иначе это приведет к деградации и крушению системы. Например, про SpinLock-и в MSDN написанно: Запрета прерываний это еще больше касается.