2013-01-19 23 views
5

Esiste un bus di comunicazione separato per gli interrupt non mascherabili che esclude il controllore di interrupt programmabile?Il PIC gestisce gli interrupt non mascherabili?

Oppure il PIC gestisce tutti gli interrupt ma passa tutti quelli non mascherabili per convenzione?

Questo dipende dall'architettura o ci sono motivi specifici per preferire uno rispetto all'altro in generale?

risposta

3

La mia risposta è da qualche esperienza hardware che ho guadagnato durante la progettazione di computer da molto molto tempo fa in una galassia lontana ... tanto tempo fa che ho pensato di ottenere un po 'di aiuto da un riferimento. Ho scoperto un posto dove scaricare Intel's ia32 64 bit system software development manual quando stavo consultando SO here.

La risposta alla prima domanda è che l'NMI è un pin sul processore che è isolato dagli interrupt mascherabili che sono configurati con il PIC.

La risposta alla seconda domanda è che il PIC non ha nulla a che fare con NMI. Tuttavia, se si dispone di un un APIC, o controllore avanzato di interruzioni programmabile, è possibile generare un NMI come indicato nel manuale:

Il processore riceve un messaggio sul bus di sistema (Pentium 4, Intel Core Duo, Intel Core 2, Intel Atom e processori Intel Xeon) o il bus seriale APIC (processori P6 della famiglia e Pentium) con modalità di consegna NMI.

La risposta alla terza domanda può essere vista nella risposta al tuo secondo. Cioè, se hai un APIC (non solo un PIC) nel tuo hardware. Se vuoi qualche altro dettaglio su come l'APIC può inviare un NMI, dai un'occhiata al link SO che ho fornito. Non sono entrato nei dettagli qui perché stavi chiedendo del PIC "lowly", non dell'APIC. Ma nel caso ti abbia frainteso, penso che troverai molte informazioni sul link SO, e se ciò non bastasse, allora vai avanti e scarica il manuale di Intel.

Spero che chiarisca alcune cose. SALUTI!

2

Il PIC (controller di interrupt programmabile) non gestisce gli NMI (interrupt non mascherabili) in x86. Gli NMI vanno direttamente al processore o tramite un altro controller, ad es. ISP. Vedi OSDev: Non Maskable Interrupt.

Tuttavia, secondo link, è possibile disabilitare NMI in questo modo:

/* enable the NMI */ 
void NMI_enable(void) 
{ 
    outb(0x70, inb(0x70)&0x7F); 
} 

/* disable the NMI */ 
void NMI_disable(void) 
{ 
    outb(0x70, inb(0x70)|=0x80); 
}