2013-01-19 13 views
5

Czy istnieje oddzielna magistrala komunikacyjna dla przerwań niemaskowalnych, która omija programowalny kontroler przerwań?Czy PIC obsługuje przerwań niemaskowalnych?

Czy PIC zarządza wszystkimi przerwaniami, ale przekazuje wszystkie niemaskowalne zgodnie z konwencją?

Czy jest to zależne od architektury, czy też istnieją konkretne powody, aby preferować jeden z nich w ogóle?

Odpowiedz

3

Moja odpowiedź jest z pewnym doświadczeniem sprzętowej, że zdobyte podczas projektowania komputerów długie dawno temu w galaktyce daleko ... tak dawno temu pomyślałem, że powinienem otrzymać trochę pomocy z referencji. Odkryłem miejsce, aby pobrać Intel's ia32 64 bit system software development manual, gdy przeglądałem SO here.

Odpowiedź na pierwsze pytanie jest taka, że ​​NMI jest pinem procesora, który jest odizolowany od przerwań maskowych, które są skonfigurowane z PIC.

Odpowiedź na drugie pytanie jest taka, że ​​PIC nie ma nic wspólnego z NMI. Jednak jeśli masz takie APIC lub zaawansowany programowalny kontroler przerwań, jest możliwe do wygenerowania NMI jak opisano w instrukcji:

Procesor otrzymuje komunikat na magistrali systemowej (Pentium 4, Intel Core Duo Procesory Intel Core 2, Intel Atom i Intel Xeon) lub magistrala szeregowa APIC (rodzina P6 i procesory Pentium) z NMI w trybie dostawy.

Odpowiedź na trzecie pytanie można znaleźć w odpowiedzi na pytanie drugie. Oznacza to, że masz na swoim sprzęcie APIC (nie tylko PIC). Jeśli chcesz uzyskać więcej informacji o tym, jak APIC może wysłać NMI, spójrz na podany przeze mnie link SO. Nie wdawałem się w szczegóły tutaj, ponieważ pytałeś o "skromny" PIC, a nie APIC. Ale na wszelki wypadek, gdybym cię źle zrozumiał, myślę, że znajdziesz mnóstwo informacji na temat linku SO, a jeśli to nie wystarczy, to pobierz instrukcję Intel.

Mam nadzieję, że to rozwiąże kilka kwestii. TWOJE ZDROWIE!

2

PIC (programowalny kontroler przerwań) nie zarządza NMI (przerwań niemaskowalnych) w x86. NMI trafiają bezpośrednio do procesora lub innego kontrolera, np. ISP. Zobacz OSDev: Non Maskable Interrupt.

Jednak według link można wyłączyć NMI w ten sposób:

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

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