Запрет всех прерываний

Тема в разделе "WASM.BEGINNERS", создана пользователем KingT, 5 ноя 2007.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Что будет если дать команду cli из под ring0?
    Приведет ли это к запрету всех прерываний?
    Я тут подумал что так можно повысить производительность программы(процессор после cli не
    реагирует на прерывание от таймера и не переключается на другие задачи и даже потоки).
    Кроме того помогает точно замерить время выполнения кода или инструкции.
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    приведет. на то это и ринг0
     
  3. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Ага. Только остаются ещё немаскируемые прерывания
     
  4. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    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
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Vilco
    Код (Text):
    1.     ;
    2.     ;Запрет прерываний (в том числе NMI)
    3.     ;
    4.     cli
    5.     in  al, 70h
    6.     or  al, 80h
    7.     out 70h, al
    можт лучче так:
    да и при чем wp-bit к запрету прерываний?
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    FreeManCPM
    а есть еще SMI#, INIT#
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    попробуй KfRaiseIrql( HIGH_LEVEL ) :)
     
  8. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Вообще-то NMI и прочие "необычные" прерывания особого резона запрещать нет: они возникают только в очень специфических условиях, а не при нормальном функционировании компутера.
     
  9. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Йа вот тут такую фишку придумал:пишем драйвер который предоставляет возможность запрещать и разрешать прерывания.
    Затем в риг3 посылаем IOCTL драйверу,он запрещает прерывания наш код выполняется с повышенной производительностью и затем через дпрайвер разрешаем прерывания.
     
  10. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    KingT

    Только эта "фишка" позволит программе пользовательского режима нарушить работу всей системы в целом. Например, она запретит прерывания и благополучно зависнет. Что делать-то будете? Только ресет или отключение питания и остаётся ;)
     
  11. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    А почему,если там нечему будет зависать.
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    KingT

    Если программа серьёзная, то доказать её правильность, а значит, и невозможность нештатного поведения, невозможно. А поднимать производительность вычислителя квадратных уравнений нет смысла.

    Кстати, если полностью запретить прерывания, станет невозможно параллельно слушать музыку, записывать СД/ДВД и т.д. -- в общем, делать всё то, что требует быстрой реакции системы на прерывания.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    И будет это страшно глючным..
    Если запретить прерывания через cli, то контекст все равно будет принудительно переключен при вызове некоторых винапи, преимущественно ожидающих (WaitForSingleObject, ...), т.к. поток при этом отправляется в State==Waiting и система найдет следующий. При этом прерывания, насколько я помню, разрешатся и фсио)
    а если ты irql поднимешь выше apc level, вообще скорее всего всё закончится BSoD'ом =)

    Вообще, ринг3 приложения не должны иметь возможность прибить работу всей системы. Это неправильно
     
  14. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Прерывания существуют не для того, чтобы их запрещать. Запрет прерываний -- это КРАЙНОСТИ, которые нужны только в строго определенных случаях. Запрещать прерывания длительное время НЕЛЬЗЯ. В системе есть куча железок, запросы которых должны быть вовремя обработанны процессором, иначе это приведет к деградации и крушению системы.

    Например, про SpinLock-и в MSDN написанно:
    Запрета прерываний это еще больше касается.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    все на самом деле не так ужасно, но соглашусь, что не стоит надолго их запрещать