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?
risposta
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 del
ss:(e)sp
. Se viene generato un interrupt, il registroflags
viene inserito nello stack. Un valore di pila non valido sposterà quella copia in qualche posizione casuale. La modifica diss:(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 cambiamentoSS
. Quelli di noi (i dinosauri) spesso inserisconoCLI
/STI
attorno all'aggiornamentoSS: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!
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
@FUZxxl Fatto. Potresti dargli un'occhiata, per favore? – Downvoter
Va bene, ma fai attenzione, c'è un comportamento sottile associato quando esegui più istruzioni di questo tipo in fila. – fuz
È 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à. –
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. –
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. –