2016-01-22 34 views
5

Cosa è necessario per disabilitare tutti gli interrupt all'avvio del sistema o al livello di codice di avvio. Se non disattivo gli interrupt cosa succederà ??Perché è necessario disabilitare tutti gli interrupt all'avvio del sistema o all'inizializzazione del sistema?

+5

È necessario perché i gestori di interrupt non sono ancora installati. Se non li si disattiva e si ottiene un'interruzione, il sistema/l'avvio si bloccherà. –

+3

non si desidera che gli interrupt vengano attivati ​​prima che i gestori corrispondenti siano installati e tutte le strutture dati inizializzate utilizzate dagli handler. altrimenti potresti non avere comportamenti imprevedibili. –

+1

Se si sta scrivendo un sistema operativo in modalità reale, la disattivazione degli interrupt potrebbe non essere richiesta.La tabella degli interrupt in modalità reale predefinita verrà utilizzata per il BIOS/hardware in questione. Se si intende creare un sistema operativo in modalità protetta, è necessario disabilitare gli interrupt prima di passare alla modalità protetta. Se si passa alla modalità protetta con interrupt attivi e non vi è alcuna tabella vettoriale interrupt (IVT), è probabile che si verifichi un triplo errore. Una volta in modalità protetta, è possibile impostare un IVT e quindi riattivare gli interrupt. –

risposta

6

Ci sono alcune situazioni in cui gli interrupt sono indesiderati, quindi sono disabilitati.
Gli esempi sono numerosi, ma la parte superiore della mia testa mi può venire con questi:

  • Modifica delss:(e)sp. Se viene generato un interrupt, il registro flags viene inserito nello stack. Un valore di pila non valido sposterà quella copia in qualche posizione casuale. La modifica di ss:(e)sp non è atomica, almeno su x86, poiché consiste in più istruzioni, quindi un interrupt può essere attivato in mezzo.
    Tuttavia, se si scrive correttamente il codice, è possibile ottenere la stessa atomicità senza disabilitare gli interrupt qui perché sono automatically disabled on certain occasions.

    @MichaelPetch pronunciato alcune specialità circa 8088 processori (il "fratello più debole" del 8086, il primo processore x86), raffiguranti una deroga a questi "certe occasioni", nei commenti a questa risposta:

    Questo è vero per gli interrupt sia spento fino alla fine della successiva istruzione (dopo lo spostamento di un valore in SS), ma c'erano 8088 processori con un errore in cui gli interrupt non erano adeguatamente spenti dopo un cambiamento SS. Quelli di noi (i dinosauri) spesso inseriscono CLI/STI attorno all'aggiornamento SS:SP per ogni evenienza (probabilità di eseguire un sistema 8088 con un tale errore è quasi prossima a zero). Dalla prospettiva storica , questo PC mag article potrebbe far luce su questo antico problema .

    (formattatori codice aggiunto.)

  • La mancanza di un'IDT/IVT. Mentre l'IDT della modalità protetta viene inizializzato o l'IVT in modalità reale a 16 bit viene modificata (o azzerata o qualcosa del genere), un interrupt salta su una posizione di memoria in cui non è presente alcuna istruzione.

In generale, è possibile affermare che le operazioni che modificano IDT/IVT in modo non atomico devono disabilitare gli interrupt.


Per inciso: io stesso ho scritto diversi bootloader già e di solito disabilitare gli interrupt durante tutto il tempo di esecuzione del bootloader. In modalità protetta, posso riattivarli alla fine. Linux 4.2 lo gestisce allo stesso modo. Se sei interessato, leggi il suo codice sorgente (/arch/x86/boot/) o quello di Minix!

+1

In realtà su x86 non è necessario disabilitare gli interrupt nel primo caso a causa di una regola speciale: gli interrupt sono disabilitati per un ciclo dopo un 'pop% ss' in modo da avere il tempo di impostare il puntatore dello stack. – fuz

+0

@FUZxxl Fatto. Potresti dargli un'occhiata, per favore? – Downvoter

+0

Va bene, ma fai attenzione, c'è un comportamento sottile associato quando esegui più istruzioni di questo tipo in fila. – fuz