arm linux内核中ARM中断实现详解.docx
《arm linux内核中ARM中断实现详解.docx》由会员分享,可在线阅读,更多相关《arm linux内核中ARM中断实现详解.docx(14页珍藏版)》请在课桌文档上搜索。
1、Iinux-2.6.26内核中ARM中断实现详解(1)作者:刘洪涛,华清远见嵌入式学院金牌讲师,ARMATC授权培训讲师。看了一些网络上关于IinUX中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对些问题的理解,先从函数注册引出问感吧.一、中断注册方法在IinUX内核中用于申请中断的函数是requesiirqstarJkerne1.()-trapinit()voidinittrapiniI(void)(unsigned1.ongvectors=CONFIG_VECTORS_BASE:nemcpy(void*)vectors,vectorsstart,_v
2、ectors_end-_vectors_start):memcpy(void*)vectors+0x200,_stubs_start,_stubs_end-_stubs_start);)在2.6.26内核中CONF1.GVECTORSBASE最初是在各个平台的配置文件中设定的,如:arch/arm/configss3c2410defconfi中CONFIGVECTORSBASE=OxffffOOOOvectorsend至_vectors_start之间为异常向量表。位于arch/arm/kerne1/entry-armv.S.g1.ob1._VeetOrS_starC_vectors_star
3、t:swiSYS_ERRORO:/未定义指令异常:软件中断异常:数据异常:保存:普通中断异常:快速中断异常:bvectorUnd+stubsoffset/复位异常:Idrpc,.1.Cvswi+stubs_offsetbvcctor_pabt+StUbS_OffSetbVeCtOJdabt+StUbS_OffSetbvectorHddrexcp1.n+stubsoffsetbVeCtoJirq+StUbS.offsetbvector_fiq+StUbS.offset.g1.ob1.vectorsend:_vectors_end:stubsend至SIUbSSIar1.之间是异常处理的位置。也位
4、于文件archarmkerne1.entry-a11nv.S,t,vectorUnd、VeCtOJPabt、vectorirq.VeCtor.fiq都在它们中间。stubsoffset值如下:.equStUbS.offset,_vectors_start+0x200-_StUbS_StartStUbS.offset是如何獭定的呢?(引用网络上的一段比较详细的解糅)当汇编器看到B指令后会把要跳转的标卷转化为相对于当前PC的偏移量(+32M)写入指令码。从上面的代码可以看到中断向量表和stubs都发生了代码搬移,所以如果中断向量表中仍然写成bvectorirq,那么实际执行的时候就无法跳转到搬移后
5、的VeCtorirq处,因为指令码里写的是原来的儡移垃,所以需要把指令码中的偏移量写成搬移后的.我们把搬移前的中断向量表中的irq入口地址记irqPC,它在中断向量表的偏移域就是irqPCrec1.orsstart,vectorirq在StUbS中的偏移量是VeCtorJrq-StUbS_start,这两个偏移量在搬移前后是不变的。搬移后YCCtOrS_Start在OXffffOOOO处,而StUbSStart在OXffff在00处,所以搬移后的VeetoJirq相对于中断向量中的中断入口地址的偏移坑就是,200+v。Ctorirq在StUbS中的偏移量再减去中断入口在向量表中的偏移量,即20
6、0+vectorirqstubss1.ar1.-irqPCvectorsstart=(vector_irq-irq_PC)+VeCtorS_start+200-StUbS_Start,对于括号内的值实际上就是中断向量表中写的VeCtorirq,她去irq_PC是由汇编器完成的,而后面的VeCtOrS_Start+200-StUbSstart就应该是stubsoffset,实际上在entry-arnv.S中也是这样定义的.三、中断处理过程这一节将以S3C2410为例,描述IinUX-2.6.26内核中,从中断开始,中断是如何步步执行到我们注册函数的。3. 1中断向量衰archarmkerne1.
7、entry-armv.S_VeCtorS_start:swiSYS_ERRORObVeCtoJUnd+stubs_offsot1.1.rpc,.1.Cvswi+stubsoffsetbvector_pabt+StUbS.offsetbvector_dabt+StUbS.offsetbVeCtOJaddreXCPtn+stubs_offsetbVeCtOjirq+stubs_offsetbvector_fiq+StUbS.offset.g1.ob1._vectors-endvectorsend:中断发生后,跳转到bvector_irq+st泌&oet的位置执行。注意现在的向:止表的初始位置是OX
8、fffTOO00。3.2 中断跳转的入I位置archarmkerne1.entry-armv.S.g1.ob1._StUbS_startstubsstart:*Interruptdispatcher*/.vector.stubirq,IRQ_MODE,4IRQ-MODEinc1.udenptrace.h中定义t0x12.1.ong_irq_usr0(USR_26/USR.32)1.ongirqiriva1.id91(FIQ26/FIQ32)1.ongirqiriva1.id92(IRQ26/IRQ32)1.ong_irq_svc3(SVC_267SVC_32).1.ong_irq_inva1.
9、id4.1.ong_irq_inva1.id51.ong_irq_inva1.id61.ong_irq_inva1.id97-1.ong_irq_inva1.id8.1.ong_irq_inva1.id09.1.ongirqinva1.ida1.ong_irq_inva1.ideb.1.ong.irq_inva1.idc.1.ong一irq_inva1.idd.1.ongirqinva1.ide1.ong.irq_inva1.idf上面代码中vectorstub宏的定义为:.macrovectorstub,mime,mode,Correction=O.a1.ign5vector-name:.i
10、fcorrectionsubIr,Ir,#correction.endifSaver,1.r_(parentPC)andspsr_蚀(parentCPS1.Ostmiasp.(r,Ir)saver.Irmrs1r,spsrsirIr,sp,即savespsrPrepareforSVC32mode.IRQsremaindisab1.ed.mrsr,cpsreorr,r,#(mode*SVjMODE)msrSPSJCXSf,r为后面进入SVC模式做准备thebranchtab1.emustimmediate1.yfo1.1.owthiscodeandIr,Ir,的XOf进入中断前的mod。的后4位
11、defineVSRMODE0x00000010鲫defineFIe1.MoDE0x00000011鲍defineIRQMODE0x00000012触defin。SYJM(2E0x00000013例defineABTMODE0x00000017购defineUM1.MODE0x000000Ib鲫defineSYSTEMMODE0x0000001fmovr,sp1.);实际上等于72stmibsp,(r1.-r1.21.1.miar,(r1.-r3addr,sp,#5PCehereforinter1.ockavoidance1.xa3.RA,”“.”movr4,5-10strr1.,spsavet
12、herea1.rcopiedfromtheexceptionstackWearenow-eadytofi1.1.intheremainingb1.anksonthestack:r2_Ir,a1.readyfixedupforcorrectreturnrestartr3-spsr-ar4-orig_rO(seept_regsdefinitioninptrace,h)A1.so,separate1.ysavesp_usrand1r_usrStmiar,(r2-r4)s1.mdbr,(sp,Ir),Enab1.ethea1.ignmenttrapwhi1.einkerne1.modea1.ignme
13、nttraprC1.earFPtomarkthefirststackframeZerO_fp.endmJt面的这段代码主要在填充结构体pt_regs,这里提到的StrUCtptregs,在inc1.ude/asm/ptrace.h中定义.此时sp指向structPtJegSostructpt_iegs1.onguregs18;;HdefineARM/psrUrCgSU6PdefineAMPCuregs15KdofineARMIruregs14HdefineARMspUregS(HdefineARMipuregs12IfdefincARMfpuregs11HdefineARMr1.uregs10
14、HdefineARMr9UregSHdefineARMr8regs8PdefineARMr7UregS7tidefineAR!ruregs6defineARMr5UregSdefineARMHuregs4PdefineARA1.r3uregs3tidefineARMr2uregs2tidefineARMr1.Uregs1.HdefineARi1.roUregS0tidefineARMORIG_iOuregs173.4 irqjand1.er的实现过程,archarBkrn1.entry-ar三v.S.macroirq-hand1.erget_irqnr_preamb1er5,Ir&在inc1u
15、deasmarch-s3c2410/entry-nacro.s中定义/宏getirqnrPreambIe为空操作,什么都不做1:get_irqnr_and_baser,r6,r5,Ir判断中断号,通过RO返回,3.5节有实现过程movner1.,SP9routineca1.1.edwithr=irqnumber,r1.=structptregs*adrneIr,Ibbneasm_do_IRQjtt入中新处理.er1.113.5get_irqnJandj)ase中断号判断过程,inc1udeasmarc-s3c2410en1.ry-macro.s.macrogetirqnr_and_base,i
16、rqnr,irqstat,base,impmovbase,#S3C24XXVIRQtrytheinterruptoffsetregister,sinceitisthereIdrirqstat,base,WNTPNDteqirqstat,#0beq1002fIdrirqnr,base,用NTOFFSETj蛆过判断INTOFFSET存放器得到中断位置movtnp,#11stirqsta1.,1.mp,Is1.irqnrbne1001.fthenumberspecifiedisnotava1.idirq,sotryandworkitoutforourse1.vesmovirqnr,#0颔starth
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- arm linux内核中ARM中断实现详解 linux 内核 中断 实现 详解

链接地址:https://www.desk33.com/p-1677807.html