2012-03-26 9 views
2

NMIを処理して、NMIが発生したときに何かしたい。 5回なぜNMIを処理できないのですか?

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

そして、私のNMIハンドラを登録NMIをトリガするためにAPICを使用するモジュールを記述します:

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); 
    } 
} 

私は "insmodのxxx.ko" と入力を第一に、私はナイーブNMIハンドラを記述しますこのモジュールをインストールするには、その後、私はは/ 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 

をそれは私が(結果= 0)nmi_handler正常に登録することを示しており、NMIは5回をトリガしますが、私はしませんでした。 ouでなければならない刺すことを見つけるnmi_handlerで言いました。 私はUbuntu 10.04 LTS、Intel Pentium 4 Dual-coreで作業します。

  • NMIハンドラが実行されなかったということはありますか?
  • LinuxでNMIを処理するにはどうすればよいですか?

答えて

1

誰もいませんか? 私のパートナーは、3日以上私に与えたので、私は、ソースコードを読んで、ULK3は、今私は質問1に答えることができます。

  • が、それは私のNMIハンドル実行されなかったことを意味していますか?実際に

IRQ番号INTベクタ番号異なるです!関数request_irq()呼び出し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); 
} 

ルック:@irq: Interrupt line to setup 。引数irqは割り込み番号であり、割り込みベクタ番号ではありません。ルックアップULK3 PDF、P203、タイマ割り込みはIRQ 0ですが、INT nrは32です!だから、私はINT2(NMI)を起動しますが、私のハンドラはINT34を実際に処理します!私はlinux-xxx/arch/x86/include/asm/irq_vectors.h

/* 
* IDT vectors usable for external interrupt sources start 
* at 0x20: 
*/ 
#define FIRST_EXTERNAL_VECTOR  0x20 
を期待し、(私はIRQ = 2、およびLinuxのアロットのINT = 50を要求し、私は私のハンドラとinitを修正?INTするIRQを変換するために、例えばどのように)ソースコード内でより多くの証拠を見つけたいが、何も得ます

私はしばらくお待ちください...質問2に答えるコードをもっと読みましょう。

関連する問題