LinuxÒÁµéÔ°ÂÛ̳'s Archiver

yanyf2006 ·¢±íÓÚ 2006-3-15 22:23

Çë½Ìuclinux+armµÄIRQÖжϴ¦Àí¹ý³ÌÖеÄÎÊÌâ

¸÷λ¸ßÊÖ:
        ´ó¼ÒºÃ!ÎÒÊÇÒ»ÃûѧϰlinuxµÄÐÂÊÖ.ËùÒÔ»¹ÓкܶàÎÊÌâÒªÇë½Ì´ó¼Ò!¼±Åδó¼Ò°ïæ!!!
        ×î½ü,ÎÒÔÚѧϰuclinux+armµÄIRQÖжϴ¦Àí¹ý³ÌµÄÔ´´úÂëÖÐ,Óöµ½Õâôһ¸öÎÊÌâ,°Ù˼²»µÃÆä½â.
        µ±IRQÖжϷ¢Éúºó,cpuÒ»¶¨»áÌøµ½/linux/arch/arm/kernel/entry-armv.SÖеÄvector_IRQ´¦Ö´ÐÐ.
vector_IRQ: @
  @ save mode specific registers
  @
  ldr r13, .LCsirq
  sub lr, lr, #4
  str lr, [r13]   @ save lr_IRQ
  mrs lr, spsr
  str lr, [r13, #4]   @ save spsr_IRQ
  @
  @ now branch to the relevent MODE handling routine
  @
  mov r13, #I_BIT | MODE_SVC
  msr spsr_c, r13   @ switch to SVC_32 mode
  and lr, lr, #15
  ldr lr, [pc, lr, lsl #2]
  movs pc, lr    @ Changes mode and branches
.LCtab_irq: .word __irq_usr   @  0  (USR_26 / USR_32)
  .word __irq_invalid   @  1  (FIQ_26 / FIQ_32)
  .word __irq_invalid   @  2  (IRQ_26 / IRQ_32)
  .word __irq_svc   @  3  (SVC_26 / SVC_32)
  .word __irq_invalid   @  4
  .word __irq_invalid   @  5
  .word __irq_invalid   @  6
  .word __irq_invalid   @  7
  .word __irq_invalid   @  8
  .word __irq_invalid   @  9
  .word __irq_invalid   @  a
  .word __irq_invalid   @  b
  .word __irq_invalid   @  c
  .word __irq_invalid   @  d
  .word __irq_invalid   @  e
  .word __irq_invalid   @  f
  .align 5
ÔÚÕâÀï,cpu½«¸ù¾ÝÖжϷ¢ÉúǰÆäËù´¦µÄÔËÐÐģʽÀ´Ñ¡ÔñÄĸö×Ó³ÌÐòÖ´ÐÐ.ÎÒÃǼÙÉèÔ­À´ÔÚÓû§Ä£Ê½(usr),Ôòcpu½«Ìø×ªµ½__irq_usr³öÖ´ÐÐ.
__irq_usr: sub sp, sp, #S_FRAME_SIZE
  stmia sp, {r0 - r12}   @ save r0 - r12
  ldr r4, .LCirq
  add r8, sp, #S_PC
  ldmia r4, {r5 - r7}   @ get saved PC, SPSR
  stmia r8, {r5 - r7}   @ save pc, psr, old_r0
  stmdb r8, {sp, lr}^
  alignment_trap r4, r7, __temp_irq  
  zero_fp
1:  get_irqnr_and_base r0, r6, r5, lr   @»ñµÃÓÅÏȼ¶×î¸ßµÄÖжϺŵ½r0
  movne r1, sp                      @½«µ±Ç°¶ÑÕ»Ö¸Õ븳¸ør1
  adrsvc ne, lr, 1b                  @ͨ¹ýÉèÖÃlr£¬Ê¹ÊµÏÖÁ˶ÔÖжϵĴ®Ðд¦Àí
  @
  @ routine called with r0 = irq number, r1 = struct pt_regs *
  @
  bne do_IRQ
  mov why, #0
  get_current_task tsk
  b ret_to_user
ÎÊÌâ³öÔÚÕâÀï:ÔÚvector_IRQ×îºó½«mov r13, #I_BIT | MODE_SVC,¼´r13=#I_BIT | MODE_SVC(³£Êý).¶ø½ô½Ó×ÅÔÚ__irq_usrÖÐÂíÉÏÓÖsub sp, sp, #S_FRAME_SIZE,¼´r13=r13 - #S_FRAME_SIZE.
ÕâÑù²»Êǽ«¶ÑÕ»Ö¸Õë»ìÂÒÁËÂð?µ±Ç¶Ì×ÖжϷ¢Éúʱ,±Ø½«Òò¶ÑÕ»Ö¸ÕëÊdz£Êý¶ø»ìÂÒ.³ý·Ç,spºÍr13²»ÊÇָͬһ¸ö¼Ä´æÆ÷,µ«ÊÇÓÖûÓнøÐÐģʽת»»Ñ½.Õâµ½µ×ÊÇÔõô»ØÊÂ?Çë´ó¼ÒÖ¸½Ì!!!!!!!!!!Íò·Ö¸Ðл!!!!!!¼±ÅÎ!

yanyf2006 ·¢±íÓÚ 2006-3-16 09:46

ÔõôûÈ˰ïÎÒ¿´Ò»ÏÂ

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.