前幾天把硬中斷完成了,這幾天在做軟中斷的事情。現在對Linux2.6.12的軟中斷機制有了一個基本的認識。在此把它的軟中斷的一些問題做一個記錄。
系統中有一個softirq_action結構,它定義在中,是一個通用結構,還有一個很重要的結構在中申明,這個結構是cpu相關的,比如在i386中這個結構為
typedef strUCt {
unsigned int __softirq_pending;
unsigned long idle_timestamp;
unsigned int __nmi_count; /* arch dependent */
unsigned int apic_timer_irqs; /* arch dependent */
} ____cacheline_aligned irq_cpustat_t;
在arm中這個結構為
typedef struct {
unsigned int __softirq_pending;
} ____cacheline_aligned irq_cpustat_t;
以上兩個結構均再中。
在中有幾個很不好理解的函數:
1:local_softirq_pending()
下面是這個函數的定義
CODE:#ifndef __ARCH_IRQ_STAT
extern irq_cpustat_t irq_stat[]; /* defined in asm/hardirq.h */
#define __IRQ_STAT(cpu, member) (irq_stat[cpu].member)
#endif
/* arch independent irq_stat fields */
#define local_softirq_pending() \
__IRQ_STAT(smp_processor_id(), __softirq_pending)
其中的smp_processor_id()如果追下去會很復雜,其實它最後只是一個數字:cpu的號碼,單cpu中為0.
2.#define __raise_softirq_irqoff(nr) do
{ local_softirq_pending() = 1UL << (nr); } while (0)
這個函數實際上是把irq_stat[cpu_id](kernel/softirq.c中)結構中的pending的第nr為置位,表示這個cpu有幾號軟中斷要處理,在do_softirq()中有對irq_stat[]的pending的相應檢查及處理,詳細的處理過程參見源代碼及《Linux Kernel Development》第7章。