前幾天把硬中斷完成了,這幾天在做軟中斷的事情 。現(xiàn)在對(duì)linux2.6.12的軟中斷機(jī)制有了一個(gè)基本的認(rèn)識(shí) 。在此把它的軟中斷的一些問題做一個(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)為
【Linux操作系統(tǒng)下的軟中斷問題分析】
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()如果追下去會(huì)很復(fù)雜,其實(shí)它最后只是一個(gè)數(shù)字:cpu的號(hào)碼,單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有幾號(hào)軟中斷要處理,在do_softirq()中有對(duì)irq_stat[]的pending的相應(yīng)檢查及處理,詳細(xì)的處理過程參見源代碼及《Linux Kernel Development》第7章 。
推薦閱讀
- 全面剖析Linux操作系統(tǒng)單用戶方式
- 用機(jī)半個(gè)月
- Linux操作系統(tǒng)不同對(duì)象全面升級(jí)方法介紹
- Linux系統(tǒng)小型日程表挑戰(zhàn)大型群件
- 下元節(jié)手抄報(bào)的畫法
- 加掛Linux操作系統(tǒng)中文件系統(tǒng)的小結(jié)
- 生綠豆芽為何要用熱水燙一下
- 外甥打燈籠歇后語 外甥打燈籠歇后語的下一句
- 卸載的軟件怎么恢復(fù)電腦
- 解讀Linux系統(tǒng)下文件權(quán)限的設(shè)置方法
