一直以來搞不懂這個中斷號的來歷,總以為是中斷控制器自己規定的乙個號,但是最近在看了s3c2440的中斷控制後才發現不是這麼一回事.2440的中斷處理只能處理32個中斷,但是其在核心中出現的中斷號卻有51,58等.而且它的外部中斷int4~7共享乙個中斷控制暫存器的一位,int8~23也是共享控制暫存器的一位.我就好奇了,它怎麼區分這些中斷呢?而且在核心**中它又很清楚的區分了這些中斷.如下面的**(2.6.13).
「include/asm-arm/arch-s3c2410/irqs.h」
…../* interrupts generated from the external interrupts sources */
#define irq_eint4 s3c2410_irq(32) /* 48 */
#define irq_eint5 s3c2410_irq(33)
#define irq_eint6 s3c2410_irq(34)
#define irq_eint7 s3c2410_irq(35)
#define irq_eint8 s3c2410_irq(36)
#define irq_eint9 s3c2410_irq(37)
#define irq_eint10 s3c2410_irq(38)
#define irq_eint11 s3c2410_irq(39)
#define irq_eint12 s3c2410_irq(40)
#define irq_eint13 s3c2410_irq(41)
#define irq_eint14 s3c2410_irq(42)
#define irq_eint15 s3c2410_irq(43)
#define irq_eint16 s3c2410_irq(44)
….在看了n久之後才發現了其中的緣由:
在初始化的時候,在相關的啟動**中將這些中斷源和中斷號進行了一一的對映,然後再初始化irq_desc.而在執行中斷的時候就根據中斷控制器的一些狀態和控制暫存器來進行轉換,將相應的中斷源轉換成中斷號,再進行中斷例程的執行.這裡針對於2440的進行簡單分析一下:
在」arch/arm/kernel/entry-armv.s」 的 irq_handler巨集就是處理中斷的,**如下:
/** interrupt handling. preserves r7, r8, r9
*/.macro irq_handler
1: get_irqnr_and_base r0, r6, r5, lr //而這裡就是將中斷源轉換成相應中斷號的乙個巨集,最後將中斷號放到r0中
movne r1, sp
@@ routine called with r0 = irq number, r1 = struct pt_regs *
@adrne lr, 1b
bne asm_do_irq
//執行一般中斷,函式原型:」arch/arm/kernel/irq.c」
// asmlinkage void asm_do_irq(unsigned int irq, struct pt_regs *regs)
//可以看出這裡需要的引數有中斷號和cpu發生中斷時需要儲存的暫存器
#ifdef config_smp
/** ***
** this macro assumes that irqstat (r6) and base (r5) are
* preserved from get_irqnr_and_base above
*/test_for_ipi r0, r6, r5, lr
movne r0, sp
adrne lr, 1b
bne do_ipi //執行cpu內部中斷或是異常
#endif
.endm
而對於中斷源到中斷號的轉換巨集get_irqnr_and_base這裡要分析一下:
在」include/asm/arch/entry-macro.s」 中定義:
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
//irqnr: 是用來存放最後的中斷號的,也就是上面傳遞過來的r0
//irqstat: 用來存放中斷狀態的,即上面的r6
//base: 這個在這巨集當中沒有使用
//tmp:這個是用來存放中斷控制器基位址的,
//下面在獲取個個控制暫存器值的時候都是在這個位址的基礎之上加相應的值
mov \tmp, #s3c24xx_va_irq //獲取中斷控制器基位址(是虛位址)
ldr \irqnr, [ \tmp, #0x14 ] @ get irq no
30000:
teq \irqnr, #4
teqne \irqnr, #5
beq 1002f @ external irq reg
…..//這裡即是對eint4~eint23的中斷號的對映,
//rq_eint4是乙個基本號,就是這個號和前面的中斷號是斷開的,其間這些中斷號是預留給其它一些匯流排下的裝置使用的.
//而之後的中斷號都是在這個號的基礎上不斷+1的,這裡是其**.
mov \irqnr, #irq_eint4 @ start extint nos
mov \irqstat, \irqstat, lsr#4 @ ignore bottom 4 bits
10021:
movs \irqstat, \irqstat, lsr#1
//這裡是根據起中斷狀態再判斷到底是那乙個中斷發生了
bcs 1004f
add \irqnr, \irqnr, #1
cmp \irqnr, #irq_eint23
ble 10021b
…..這裡就完成了中斷引腳和中斷號的對應關係,哎,終於搞明白了!!!但是個個體繫結構和中斷控制器的對映方式應該是不一樣的,這個只是真對於s3c2440來說的
這裡就完成了中斷
中斷號和晶元中斷引腳的關係
一直以來搞不懂這個中斷號的來歷,總以為是中斷控制器自己規定的乙個號,但是最近在看了s3c2440的中斷控制後才發現不是這麼一回事.2440的中斷處理只能處理32個中斷,但是其在核心 現的中斷號卻有51,58等.而且它的外部中斷int4 7共享乙個中斷控制暫存器的一位,int8 23也是共享控制暫存器...
常見的中斷號
最近工作需要用dos系統開發,以前一直搞linux,還容得下其他的系統 下面將pc機常用的中斷號貼出來,都怪自己大學的微機原理與接 術沒學好啊!int 00h 0 作為除數 int 01h 單步中斷 int 02h 非遮蔽中斷 int 03h 斷點中斷 int 04h 算數溢位錯誤 int 05h ...
中斷向量表 和 中斷描述符 關係
在實模式下,從位址 0 開始的 1kb 大小記憶體構成乙個中斷向量表,表中每一項包括 4 個位元組,對應一 個中斷向量,儲存了該中斷向量所對應中斷處理程式的入口位址,如圖 6.4 所示。進入保護模式後,中斷向量表改名為中斷描述符表 interrupt descriptor table,idt 並允許...