前幾天把硬中斷完成了,這幾天在做軟中斷的事情。現(xiàn)在對linux2.6.12的軟中斷機(jī)制有了一個(gè)基本的認(rèn)識。在此把它的軟中斷的一些問題做一個(gè)記錄。
系統(tǒng)中有一個(gè)softirq_action結(jié)構(gòu),它定義在中,是一個(gè)通用結(jié)構(gòu),還有一個(gè)很重要的結(jié)構(gòu)在中申明,這個(gè)結(jié)構(gòu)是cpu相關(guān)的,比如在i386中這個(gè)結(jié)構(gòu)為
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中這個(gè)結(jié)構(gòu)為
typedef struct {
unsigned int __softirq_pending;
} ____cacheline_aligned irq_cpustat_t;
以上兩個(gè)結(jié)構(gòu)均再中。
在中有幾個(gè)很不好理解的函數(shù):
1:local_softirq_pending()
下面是這個(gè)函數(shù)的定義
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()如果追下去會很復(fù)雜,其實(shí)它最后只是一個(gè)數(shù)字:cpu的號碼,單cpu中為0.
2.#define __raise_softirq_irqoff(nr) do
{ local_softirq_pending() |= 1UL << (nr); } while (0)
這個(gè)函數(shù)實(shí)際上是把irq_stat[cpu_id](kernel/softirq.c中)結(jié)構(gòu)中的pending的第nr為置位,表示這個(gè)cpu有幾號軟中斷要處理,在do_softirq()中有對irq_stat[]的pending的相應(yīng)檢查及處理,詳細(xì)的處理過程參見源代碼及《Linux Kernel Development》第7章。
新聞熱點(diǎn)
疑難解答
圖片精選