2010-08-03 19 views

risposta

16

C'è una buona pagina di Wikipedia su interrupt handlers.

"Un gestore di interrupt, noto anche come una routine di servizio di interruzione (ISR), è una subroutine richiamata in un sistema operativo o driver di periferica cui esecuzione è innescata dalla ricezione di un interrupt. Gestori di interrupt sono una moltitudine di funzioni, che variano in base al motivo per cui è stato generato l'interrupt e alla velocità con cui il gestore di interrupt completa il proprio compito. "

Fondamentalmente quando un pezzo di hardware (un interrupt hardware) o qualche task OS (interrupt software) deve eseguirlo, attiva un interrupt. Se questi interrupt non sono mascherati (ignorati), il sistema operativo interromperà ciò che sta facendo e invierà un codice speciale per gestire questo nuovo evento.

Un buon esempio è la lettura da un disco rigido. L'unità è lenta e non si desidera che il sistema operativo attenda il ritorno dei dati; vuoi che il sistema operativo vada a fare altre cose. Così si imposta il sistema in modo che quando il disco ha i dati richiesti, solleva un interrupt. Nella routine di servizio di interrupt per il disco, la CPU prenderà i dati che sono ora pronti e li restituirà al richiedente.

Gli ISR ​​devono spesso accadere rapidamente poiché l'hardware può disporre di un buffer limitato, che verrà sovrascritto dai nuovi dati se ora viene estratto abbastanza rapidamente. È inoltre importante completare rapidamente l'ISR mentre la CPU esegue la manutenzione di un ISR. Gli altri interrupt saranno mascherati, il che significa che se la CPU non riesce a raggiungerli abbastanza rapidamente i dati possono andare persi.

0

Il modo migliore per capire è di creare alcuni esempi minimi.

Minimal esempio 16 bit

Prima imparare a creare un sistema operativo bootloader minimal ed eseguirlo su QEMU e hardware reale come ho spiegato qui: https://stackoverflow.com/a/32483545/895245

Ora è possibile eseguire in 16 bit in modalità reale:

movw $handler0, 0x00 
    mov %cs, 0x02 
    movw $handler1, 0x04 
    mov %cs, 0x06 
    int $0 
    int $1 
    hlt 
handler0: 
    /* Do 0. */ 
    iret 
handler1: 
    /* Do 1. */ 
    iret 

Ciò farebbe in ordine:

  • Do 0.
  • Do 1.
  • hlt: interrompere l'esecuzione di

Si noti come il processore cerca il primo gestore all'indirizzo 0, e la seconda a 4: che è una tabella di gestori chiamato il IVT, e ogni voce ha 4 byte.

Minimal example that does some IO per rendere visibili i gestori.

modalità protetta

moderni sistemi operativi eseguiti in modalità cosiddetta protetta.

La gestione ha più opzioni in questa modalità, quindi è più complessa, ma lo spirito è lo stesso.

Minimal example

Vedi anche

questione connessa: What does "int 0x80" mean in assembly code?

Problemi correlati