2009-10-06 7 views
5

È possibile disattivare tutti gli interrupt con un programma ASM/C/C++ per ottenere il controllo completo sul processore?Disabilita interrupt hardware e software

Se sì -> come?

In caso contrario -> come funzionano le chiamate del sistema operativo "atomico" (ad esempio, inserendo una sezione critica)?

Grazie per il vostro aiuto!

+4

È necessario indicare quale processore si sta utilizzando. E quale sistema operativo se presente. Sul moderno sistema operativo desktop/server, il codice userland solitamente viene eseguito in una modalità non privilegiata che impedisce di farlo. – nos

+0

Quale processore? Quale sistema operativo? –

+0

MS Windows (XP SP2/SP3, Vista, 7) versioni x86 e x64, processori Intel moderni (ad esempio Intel Core 2 Duo) –

risposta

3

su x86 e molti altri processori moderni è possibile ottenere istruzioni atomiche. Quelli che sono GARANTITI non devono essere terminati prima che un altro thread/processore possa accedere a quella memoria.

In Win32 si dispone delle funzioni interbloccate * che l'astraggono da te su piattaforme supportate.

Su un MIPS molte istruzioni possono avere un .I aggiunto alla fine dell'istruzione per garantire l'interblocco.

+1

Su un x86 è possibile precedere determinate istruzioni con "blocco" per renderle atomiche. – hirschhornsalz

+0

Ahh grazie :) Doveva essere qualcosa del genere :) – Goz

+0

puoi darmi un esempio di codice sorgente per favore? –

4

Nell'assemblaggio x86 i comandi sono

  • sti set di abilitazione di interrupt bit
  • cli interrupt chiaro bit di abilitazione

Questi comandi impostati e cancellare il IF Flag. Quando viene impostato il flag IF, la CPU gestirà gli interrupt hardware e, quando è chiaro, la CPU ignorerà gli interrupt hardware. Tuttavia, non influisce sulla gestione di interrupt non mascherabili e non influisce sugli interrupt o eccezioni software. Queste istruzioni, inoltre, non funzionano in modalità non privilegiata (di solito tutto ciò che è più in alto dell'anello 0, a seconda di IOPL).

+4

hai ottenuto indietro. STI abilita gli interrupt. CLI disabilita. –

+0

Inoltre non disattiva gli interrupt o le eccezioni software – Stewart

+0

Grazie ragazzi per i vostri commenti e le vostre modifiche: STI abilita gli interrupt, CLI disabilita gli interrupt è davvero corretto. Ero sicuro che fosse il contrario, ma ho imparato il mio assembly su un C64, quindi ho cercato: il 6510 aveva disabilitato CLI e STI per abilitare. Non ho capito bene;-) –

0

L'x86 ha un flag di interruzione (IF) nel registro FLAGS. Quando questo flag è impostato su 0, gli interrupt hardware sono disabilitati, altrimenti sono abilitati. Il comando cli imposta questo flag su 0, e sti lo imposta su 1. Le istruzioni che caricano i valori nel registro FLAGS (come popf e iret) possono anche modificare questo flag.

buona fortuna!