2012-03-26 8 views
2

Ich möchte mit NMI umgehen und etwas tun, wenn NMI auftreten. Erstens schreibe ich eine naive NMI-Handler:Warum kann ich mit NMI nicht umgehen?

static irqreturn_t nmi_handler(int irq, void* dev_id) { 
    printk("-#_#- I'm TT, I am handling NMI.\n"); 
    return IRQ_HANDLED; 
} 

und ein Modul schreiben, um meine NMI-Handler zu registrieren, dann APIC verwenden NMI 5 mal auslösen:

static void __init ipi_init(void) { 
    printk("-#_#- I'm coming again, hahaha!\n"); 

    int result = request_irq(NMI_VECTOR, 
     nmi_handler, IRQF_DISABLED, "NMI Watchdog", NULL); 
    printk("--- the result of request_irq is: %d\n", result); 
    int i; 
    for (i = 0; i < 5; ++i) { 
    apic->send_IPI_allbutself(NMI_VECTOR); 
    ssleep(1); 
    } 
} 

Now "insmod xxx.ko" Ich tippe dieses Modul zu installieren, danach, überprüfe ich das Verzeichnis/var/log/syslog:

kernel: [ 1166.231005] -#_#- I'm coming again, hahaha! 
kernel: [ 1166.231028] --- the result of request_irq is: 0 
kernel: [ 1166.231050] Uhhuh. NMI received for unknown reason 00 on CPU 1. 
kernel: [ 1166.231055] Do you have a strange power saving mode enabled? 
kernel: [ 1166.231058] Dazed and confused, but trying to continue 
kernel: [ 1167.196293] Uhhuh. NMI received for unknown reason 00 on CPU 1. 
kernel: [ 1167.196293] Do you have a strange power saving mode enabled? 
kernel: [ 1167.196293] Dazed and confused, but trying to continue 
kernel: [ 1168.201288] Uhhuh. NMI received for unknown reason 00 on CPU 1. 
kernel: [ 1168.201288] Do you have a strange power saving mode enabled? 
kernel: [ 1168.201288] Dazed and confused, but trying to continue 
kernel: [ 1169.235553] Uhhuh. NMI received for unknown reason 00 on CPU 1. 
kernel: [ 1169.235553] Do you have a strange power saving mode enabled? 
kernel: [ 1169.235553] Dazed and confused, but trying to continue 
kernel: [ 1170.236343] Uhhuh. NMI received for unknown reason 00 on CPU 1. 
kernel: [ 1170.236343] Do you have a strange power saving mode enabled? 
kernel: [ 1170.236343] Dazed and confused, but trying to continue 

Es zeigt, dass ich nmi_handler erfolgreich (Ergebnis = 0), und NMI wurden 5-mal ausgelöst registrieren, aber ich habe nicht Finde einen Stich, der du sein solltest in nmi_handler umgesetzt. Ich arbeite auf Ubuntu 10.04 LTS, Intel Pentium 4 Dual-Core.

  • Bedeutet es, dass mein NMI-Handler nicht ausgeführt wurde?
  • Wie mache ich Handler NMI in Linux?

Antwort

1

Niemand? Mein Partner hat mir drei Tage, so las ich den Quellcode und ULK3, jetzt kann ich beantworten Frage 1:

  • Ist es mein NMI Griff bedeuten konnte nicht ausgeführt werden?

Tatsächlich IRQ-Nummer und INT Vektornummer sind verschiedene! Die Funktion request_irq() -Aufruf setup_irq():

/** 
* setup_irq - setup an interrupt 
* @irq: Interrupt line to setup 
* @act: irqaction for the interrupt 
* 
* Used to statically setup interrupts in the early boot process. 
*/ 
int setup_irq(unsigned int irq, struct irqaction *act) 
{ 
    struct irq_desc *desc = irq_to_desc(irq); 

    return __setup_irq(irq, desc, act); 
} 

Blick auf diese: @irq: Interrupt line to setup . Das Argument irq ist die Interrupt-Zeilennummer, nicht die Interrupt-Vektornummer. Nachschlagen ULK3 PDF, P203, Timer-Interrupt hat IRQ 0, aber INT nr ist 32! Also triggert ich den INT2 (NMI), aber mein Handler behandelt den INT34 tatsächlich! Ich möchte mehr Beweise im Quellcode finden (zB wie IRQ konvertieren INT? Ich meine Handler und init ändern, bitte ich irq = 2 und Linux zuzuteilen INT = 50), aber nichts bekommen, erwarten linux-xxx/arch/x86/include/asm/irq_vectors.h

/* 
* IDT vectors usable for external interrupt sources start 
* at 0x20: 
*/ 
#define FIRST_EXTERNAL_VECTOR  0x20 

Warten Sie eine Weile ... lassen Sie mich mehr Codes lesen, um Frage 2 zu beantworten.

Verwandte Themen