Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
$B3d$j9~$_(B
[go: Go Back, main page]

$B3d$j9~$_(B

					2011$BG/(B02$B7n(B08$BF|(B
$B>pJs2J3XN`(B $B%*%Z%l!<%F%#%s%0%7%9%F%`(B II

                                       $BC^GHBg3X(B $B%7%9%F%`>pJs9)3X8&5f2J(B 
                                       $B%3%s%T%e!<%?%5%$%(%s%9@l96(B, $BEE;R!&>pJs9)3X7O(B
                                       $B?7>k(B $BLw(B
                                       <yas@is.tsukuba.ac.jp>

$B$3$N%Z!<%8$O!" http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2010/2011-02-08
$B$"$k$$$O!" http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

$B"#:#F|$NBg;v$JOC(B

$B"#3d$j9~$_(B

$B"!3d$j9~$_$NI,MW@-(B

$B"!3d$j9~$_$H$O(B

$B"!(Bx86$B$N3d$j9~$_%3%s%H%m!<%i(B

$B"!(BIntel 8259 PIC

8259$B!

$B?^(B? x86 $B$N(B Intel 8259

$B"!(BAPIC

Local APIC$B!

$B?^(B? x86 $B$N(B APIC

APIC $B$O!"
  • $B%W%m%;%C%5$N%T%s(B(LINT0, LINT1)
  • $BFbIt$N%?%$%^(B
  • $BFbIt$N%Q%U%)!<%^%s%9!&%b%K%?(B
  • $BFbIt$N29EY%;%s%5(B
  • $BFbIt$N(BAPIC$B%(%i!<(B
  • $BB>$N%W%m%;%C%5(B($B%W%m%;%C%54V3d$j9~$_(B)
  • $B30It$N(B I/O APIC$B!#IaDL!"(B24$B8D$N3d$j9~$_$r

    $B"!(B/proc/interrupts

    /proc/interrupts $B$O!"3d$j9~$_$N2s?t$rJ];}$7$F$$$k!#(B
    $ cat /proc/interrupts  [$B
               CPU0       CPU1       
      0:    4208761      38584    IO-APIC-edge  timer
      1:          0          3    IO-APIC-edge  i8042
      7:          0          0    IO-APIC-edge  parport0
      8:          1          2    IO-APIC-edge  rtc
      9:          0          0   IO-APIC-level  acpi
     12:          3          1    IO-APIC-edge  i8042
     50:       5380      86508         PCI-MSI  ahci
     74:        346          0         PCI-MSI  HDA Intel
     98:        294      28232         PCI-MSI  eth1
    169:        130      57006   IO-APIC-level  uhci_hcd:usb3
    177:          0          0   IO-APIC-level  uhci_hcd:usb4, uhci_hcd:usb7
    217:        358     149530   IO-APIC-level  ehci_hcd:usb1, uhci_hcd:usb5
    225:          0          0   IO-APIC-level  ehci_hcd:usb2, uhci_hcd:usb6
    233:          0          0   IO-APIC-level  uhci_hcd:usb8
    NMI:          0          0 
    LOC:    4246864    4246863 
    ERR:          0
    MIS:          0
    $ []
    

    $B"!Nc30(B

    $BNc30(B(exceptions) $B$H$O!"%O!<%I%&%'%"!&%G%P%$%9$H$OL54X78$K!"(B CPU $B$NL?Na
  • 0 $B$K$h$k3d$j;;(B
  • $B%Z!<%8!&%U%)!<%k%H(B
  • $BNc30$r@8$8$k(BCPU$BL?Na$N $BB?$/$N(B CPU $B%"!<%-%F%/%A%c$G$O!"Nc30$r3d$j9~$_$HF1$8$h$&$K07$&!#(B x86 $B$G$O!"%7%9%F%`!&%3!<%k$N=hM}$b!"3d$j9~$_$HF1$8$h$&$K07$&!#(B

    $B"!3d$j9~$_%O%s%I%i(B

    $B3d$j9~$_%O%s%I%i(B(interrupt handlers)$B$H$O!"3d$j9~$_$,@8$8$?;~$K$=$l$K1~(B $BEz$9$k$?$a$K

    $BNc(B:

    • $B%-!<%\!<%IMQ(B
    • $B%?%$%^MQ(B
    • $B%O!<%I%G%#%9%/MQ(B
    Linux $B$G$O!"3d$j9~$_%O%s%I%i$O!"(BC$B8@8l$N4X?t!#IaDL$N4X?t$H$N0c$$!#(B
    • $B3d$j9~$_$K4X$9$k>pJs$,EO$5$l$k(B
    • $B!V3d$j9~$_%3%s%F%-%9%H!W$d!V%"%H%_%C%/!&%3%s%F%-%9%H!W$H$$$&!"@)Ls(B $B$,$-$D$$>uBV$G8F$P$l$k!#(B
    • $B3d$j9~$_$O!"$$$D@8$8$k$+M=B,ITG=$J$N$G!"3d$j9~$_%O%s%I%i$O!"$$$D8F(B $B$P$l$k$+M=B,ITG=!#(B

    $B"!3d$j9~$_$NA0H>ItJ,$H8eH>ItJ,(B

    $BN)$5$;$?$$(B
    • $B3d$j9~$_%O%s%I%i$O!"$G$-$k$@$1B.$/ $B3d$j9~$_%O%s%I%i$N=hM}$O!";~$K;~4V$,$+$+$C$F$7$^$&$3$H$,$"$k!#Nc!'(B $B%M%C%H%o!<%/$+$i$N%Q%1%C%H$N Linux $B$G$O!"$3$l$rN>N)$9$k$?$a$K!"3d$j9~$_$N=hM}$r(B2$B$D$KJ,$1$k!#(B
      • $BA0H>(B(top half)$B!#3d$j9~$_8e!"B(:B$K $B8eH>(B(bottom half)$B!#3d$j9~$_$N8e!"ET9g$N$h$$;~4|$K$d$k!#(B $B$=$N8e$N3d$j9~$_$r5v2D$7$?>uBV$G9T$&!#(B
      $BNc(B: $B%M%C%H%o!<%/%+!<%I$K$h$k%a%C%;!<%8$N
    • $BA0H>$G!"%O!<%I%&%'%"$X$NDLCN$H!"%G!<%?$N%a%b%j$X$N%3%T! $B8eH>$G!"(BTCP/IP $B$N=hM}!#(B

    $B"!3d$j9~$_HV9f$N6&M-(B

    1$B$D$N3d$j9~$_HV9f$r!"J#?t$N%G%P%$%9$G6&M-$9$k$3$H$,$"$k!#(B
    • $B3d$j9~$_$,@8$8$?;~$K$O!"$I$N%G%P%$%9$N$b$N$+$9$0$K$OJ,$+$i$J$$!#(B
    • $B3d$j9~$_$,@8$8$k$H!"2DG=@-$,$"$kA4$F$N%G%P%$%9$N3d$j9~$_%O%s%I%i$r(B $B

      $B"!(Brequest_irq()

      Linux $B$G!"3d$j9~$_$NA0H>It$rEPO?$9$k$K$O!"(Brequest_irq() $B$r;H$&!#(B CPU$B%"!<%-%F%/%A%c$KFHN)$7$?7A$G3d$j9~$_%O%s%I%i$rEPO?$9$k$K$O!"(B request_irq() $B$rMQ$$$k!#(B
      include/linux/interrupt.h
      
      typedef irqreturn_t (*irq_handler_t)(int, void *);
      
      request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
                  const char *name, void *dev)
      
      • irq: $B3d$j9~$_HV9f!#(B
      • handler: $B3d$j9~$_%O%s%I%i!#(B
      • flags: $B%U%i%0!#8e=R!#(B
      • name: $BL>A0!#(B/proc/interrupts $B$d(B /proc/irq $B$K8=$l$k!#(B
      • dev: $B%G%P%$%9!#3d$j9~$_$,J#?t$N%G%P%$%9$G6&M-$5$l$k;~$K!"$I$N%G%P(B $B%$%9$+$r6hJL$9$k$?$a$K;H$o$l$k!#IaDL$O!"9=B$BN$X$N%]%$%s%?!#3d$j9~$_%O(B $B%s%I%i(B irq_handler_t handler $B$,8F$P$l$?;~$K$b!"$3$NCM$,0z?t$GEO$5$l$k!#(B free_irq() $B$G3d$j9~$_%O%s%I%i$r:o=|$9$k;~$K$O!"$3$NCM$,(B cookie $B$H$7$FF/(B $B$/!#(B
      • $B7k2L(B: $B@.8y$9$k$H(B 0$B$rJV$7!"<:GT$9$k$H(B 0 $B0J30$rJV$9!#$?$H$($P!"(B-EBUSY $B$@$H3d$j9~$_@~$,;H$o$l$F$$$k!#(B
      $B
      IRQF_DISABLED
      $B3d$j9~$_%O%s%I%i$N$N3d$j9~$_$O5v2D$5$l$?>uBV$GF0:n$9$k!#(B
      IRQF_SAMPLE_RANDOM
      $BMp?t@8@.4o$N$?$a$K3d$j9~$_$rMxMQ$7$F$b$h$$!#(B
      IRQF_TIMER
      $B%7%9%F%`!&%?%$%^$N$?$a$KMxMQ$9$k!#(B
      IRQF_SHARED
      $BJ#?t$N%G%P%$%9$GF1$83d$j9~$_@~$r6&M-$G$-$k!#(B

      $B"!(Bfree_irq()

      $B3d$j9~$_%O%s%I%i$,ITMW$K$J$C$?;~$K$O!"(Bfree_irq() $B$G void free_irq(unsigned int, void *dev)
      • irq: $B3d$j9~$_HV9f!#(B
      • dev: request_irq() $B$G;XDj$7$?%G%P%$%9!#(B

      $B"!(Birq_handler_t handler

      $B3d$j9~$_%O%s%I%i$O!" irqreturn_t irq_handler_t(int irq, void *dev)
      • irq: $B3d$j9~$_HV9f!#(B
      • dev: request_irq() $B$G;XDj$7$?%G%P%$%9!#(B
      • $B7k2L(B: $B7k2L$O!"(Birqreturn_t $B!#(B
      IRQ_NONE
      $B3d$j9~$_$O!"<+J,<+?H$N$b$N$G$O$J$+$C$?!#(B
      IRQ_HANDLED
      $B3d$j9~$_$r$-$A$s$H=hM}$7$?!#(B
      $BA43d$j9~$_%O%s%I%i$,(B IRQ_NONE $B$rJV$;$P!"$J$s$i$+$N%H%i%V%k$r0UL#$9$k!#(B $BJ#?t$N3d$j9~$_%O%s%I%i$,(B IRQ_HANDLED $B$rJV$9$3$H$O@5>o!#(B

      $B"!(Bx86 CMOS Real-Time Clock rtc_interrupt()

      x86 CMOS Real-Time Clock $B$G$N3d$j9~$_%O%s%I%i$NNc!#(B
      drivers/char/rtc.c
      
        96:	static unsigned long rtc_port;
        97:	static int rtc_irq;
      ...
       191:	static unsigned long rtc_status;        /* bitmapped status byte.       */
       192:	static unsigned long rtc_freq;          /* Current periodic IRQ rate    */
       193:	static unsigned long rtc_irq_data;      /* our output to the world      */
      ...
      
       953:	static int __init rtc_init(void)
       954:	{
      ...
      1000:	        if (request_irq(rtc_irq, rtc_interrupt, IRQF_SHARED, "rtc",
      1001:	                        (void *)&rtc_port)) {
      1002:	                rtc_has_irq = 0;
      1003:	                printk(KERN_ERR "rtc: cannot register IRQ %d\n", rtc_irq);
      1004:	                return -EIO;
      1005:	        }
      ...
       790:	}
      
       239:	static irqreturn_t rtc_interrupt(int irq, void *dev_id)
       240:	{
      ...
       248:	        spin_lock(&rtc_lock);
       249:	        rtc_irq_data += 0x100;
       250:	        rtc_irq_data &= ~0xff;
      ...
       259:	                rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0);
      ...
      
       262:	        if (rtc_status & RTC_TIMER_ON)
       263:	                mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100);
       264:	
       265:	        spin_unlock(&rtc_lock);
       266:	
       267:	        /* Now do the rest of the actions */
       268:	        spin_lock(&rtc_task_lock);
       269:	        if (rtc_callback)
       270:	                rtc_callback->func(rtc_callback->private_data);
       271:	        spin_unlock(&rtc_task_lock);
       272:	        wake_up_interruptible(&rtc_wait);
       273:	
       274:	        kill_fasync(&rtc_async_queue, SIGIO, POLL_IN);
       275:	
       276:	        return IRQ_HANDLED;
       277:	}
      
      
      • x86 CMOS Real-Time Clock $B$G$O!"(B3$B spin_lock_irq() $B$H(B spin_unlock_irq() $B$O!"%+!<%M%kFb$NAj8_GS=|$N;E(B $BAH$_!#$?$H$($3$N4X?t(B rtc_open() $B<+?H$,J#?tF1;~$K rtc_irq_data $B$O!"(Bunsigned long $B$G!"$=$N2s$N3d$j9~$_$N%U%i%0$r(B CMOS_READ() $B$G%G%P%$%9$+$iFI$_=P$7$7$FJ]B8$9$k!#(B
      • rtc_status $B$N(B RTC_TIMER_ON $B%S%C%H$,%;%C%H$5$l$F$$$l$P!"(B mod_timer() $B$rFI$s$G!";~9o$r@_Dj$9$k!#(B($BIaDL$O$3$N5!G=$O;H$o$l$J$$!#(B)
      • $BFCJL$J(B callback $B4X?t$,EPO?$5$l$F$$$l$P!"$=$l$r8F$S=P$9!#(B

      $B"!3d$j9~$_%3%s%F%-%9%H(B

      $B3d$j9~$_%O%s%I%i$,

      $B%W%m%;%9!&%3%s%F%-%9%H$G$G$-$k$3$H!#(B

      • current $B$K$h$j!"8=:_ sleep $B$G$-$k!#(B
      • $B%9%1%8%e!<%i$r8F$s$G!"B>$N%W%m%;%9$X@ZBX$($k$3$H$,$G$-$k!#(B

      $B3d$j9~$_%3%s%F%-%9%H$G$O!"$3$N$&$h$&$J$3$H$O$G$-$J$$!#(B $BB.$d$+$K=*N;$9$Y$-$G$"$k!#(Bbusy loop $B$O$G$-$k$,!"$"$^$j(B $B$d$i$J$$J}$,$h$$!#B>$N3d$j9~$_$O!"

      $B"!(Bx86 Interrupt Descriptor Table (IDT)

      x86 IDT $B$O!"%O!<%I%&%'%"!&%l%Y%k$N3d$j9~$_%O%s%I%i$N0lMwI=$rJ];}$9$k!#(B $B$=$N@hF,HVCO$O!"(BIDTR $B%l%8%9%?$KJ]B8$5$l$k!#(B
      arch/x86/include/asm/irq_vectors.h
       131:	#define NR_VECTORS                       256
      
      
      arch/x86/kernel/traps.c
        78:	gate_desc idt_table[NR_VECTORS] __page_aligned_data = { { { { 0, 0 } } }, };
      ...
       837:	void __init trap_init(void)
       838:	{
      ...
       849:	        set_intr_gate(0, &divide_error);
       850:	        set_intr_gate_ist(2, &nmi, NMI_STACK);
      ...
       896:	        set_system_trap_gate(SYSCALL_VECTOR, &system_call);
       897:	        set_bit(SYSCALL_VECTOR, used_vectors);
      
      arch/x86/include/asm/irq_vectors.h:
        50:	# define SYSCALL_VECTOR                 0x80
      
      
      • trap_init() $B$O!"(BIDT $B$r=i4|2=$9$k!#(B
      • ITD $B$N%$%s%G%C%/%9$O!"3d$j9~$_%Y%/%?!#(B
      • $B3d$j9~$_%Y%/%?$O!"(B0 $B$+$i(B 0xff $B$^$G$"$k!#(B0 $B$+$i(B 0x1f $B$O!"(BIntel $B$K$h(B $B$j;H$$J}$,7h$a$i$l$F$$$k!#(B
      • $B3d$j9~$_%Y%/%?(B 0x80 $B$G!"(Bsystem_call() $B$H$$$&4X?t$,EPO?$5$l$F$$$k!#(B

      $B"!(Bdo_IRQ

      x86 Linux $B$G$O!"(BInterrupt Descriptor Table $B$K=>$$!"(Bdo_IRQ() $B$,8F$P$l$k!#(B $B0z?t$K$O!"(Bx86 $B$N%l%8%9%?$rI=8=$7$?9=B$BN$X$N%]%$%s%?$,EO$5$l$k!#$3$l$K(B $B$h$j!"3d$j9~$_$,H/@8$7$?;~$N%l%8%9%?$NCM$,$o$+$k!#3d$j9~$_%O%s%I%i$,M-(B $B8z$G!"3d$j9~$_@~$KEPO?$5$l$F$$$l$P!":G=*E*$K$O!"(Bhandle_IRQ_event()$B!!$H(B $B$$$&!"(BCPU $B$H$OFHN)$N3d$j9~$_%O%s%I%i$,8F$P$l$k!#(B

      $B"!(Bhandle_IRQ_event()

      kernel/irq/handle.c
      
       368:	irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
       369:	{
       370:	        irqreturn_t ret, retval = IRQ_NONE;
       371:	        unsigned int status = 0;
       372:	
       373:	        do {
      ...
       375:	                ret = action->handler(irq, action->dev_id);
      ...
       378:	                switch (ret) {
      ...
       410:	                case IRQ_HANDLED:
       411:	                        status |= action->flags;
       412:	                        break;
       413:	
       414:	                default:
       415:	                        break;
       416:	                }
       417:	
       418:	                retval |= ret;
       419:	                action = action->next;
       420:	        } while (action);
       421:	
       422:	        if (status & IRQF_SAMPLE_RANDOM)
       423:	                add_interrupt_randomness(irq);
       424:	        local_irq_disable();
       425:	
       426:	        return retval;
       427:	}
      
      • struct irqaction *action $B$O!"(Baction->next $B$G%j%9%H9=B$$r(B $B:n$C$F$$$k!#(B
      • $B3F9=B$BN$K4^$^$l$F$$$k(B action->handler() $B$r=g$K8F$S=P(B $B$9!#(B
      • IRQF_SAMPLE_RANDOM $B$J$i!"(Badd_interrupt_randomness() $B$r8F$S!"Mp?t$r(B $B$+$-:.$<$k!#(B
      • local_irq_disable() $B$G3d$j9~$_$r6X;_$9$k!#(B

      $B"!3d$j9~$_$N5v2D!&6X;_(B

      $B%^%/%m$r$D$+$C$FJ]B8$7$?$j2sI|$7$?$j$9$k!#(B
      
      unsigned long flags;
      
      local_irq_save(flags); /* $B3d$j9~$_6X;_(B */
      ...
      local_irq_restore(flags); /* $B3d$j9~$_5v2D(B (save $B$N;~$N>uBV$K$b$I$k(B) */
      
      
      $BC10l(BCPU$B$N(B x86 $B$G$O!"(Bcli() $B$H(B sti() $B$G3d$j9~$_$N6X;_$H5v2D$r@_Dj$9$kJ}K!(B $B$,$"$C$?!#$=$l$=$lF1L>$N(B CPU $B$NL?Na$r$N(B CPU $B$G$O5v2D$5$l$F$$$k$3$H$,$"$k$N$G!"(Bcli()/sti() $B$NJ}K!$O(B $B;H$($J$$!#(B

      $BFCDj$N3d$j9~$_HV9f$N3d$j9~$_$r6X;_$9$kJ}K!$b$"$k!#(B

      void disable_irq(unsigned ing irq);
          // $BA4(BCPU$B$N3d$j9~$_$r6X;_$9$k(B
      
      void disable_irq_nosync(unsigned ing irq);
          // $BF1>e!#$?$@$7!"3d$j9~$_%O%s%I%i$N=*N;$rBT$?$J$$!#(B
      
      void enable_irq(unsigned ing irq);
          // $B3d$j9~$_$r5v2D$9$k!#(B
      
      void synchronize_irq(unsigned ing irq);
          // $B3d$j9~$_%O%s%I%i$N=*N;$rBT$D!#(B
      

      $B"#%/%$%:(B7 $B3d$j9~$_(B

      $B!zLdBj(B(701) $B3d$j9~$_$NMxMQ(B

      $B%3%s%T%e!<$G!"%-!<%\!<%I!"%^%&%9!"%M%C%H%o!<%/!&%+!<%IEy$N%G%P%$%9$+$i(B $B$NF~NO$G$O3d$j9~$_$,B?$/;H$o$l$F$$$k!#3d$j9~$_$r;H$&J}K!$H3d$j9~$_$r;H(B $B$o$J$$J}K!$rBPHf$7$F!"3d$j9~$_$r;H$&J}K!$NMxE@$r@bL@$7$J$5$$!#(B

      $B!zLdBj(B(702) x86 CMOS Real-Time Clock $B$N3d$j9~$_%O%s%I%i(B

      x86 CMOS Real-Time Clock $B$N3d$j9~$_%O%s%I%i$r4X?tL>$GEz$($J$5$$!#(B $B$=$N4X?t$N0z?t$H7k2L$r!"4JC1$K@bL@$7$J$5$$!#(B

      $B!zLdBj(B(703) x86 CMOS Real-Time Clock $B$N3d$j9~$_%O%s%I%i$N8F$S=P$7(B

      $B:#F|$N;qNA$NCf$G!"(Bx86 CMOS Real-Time Clock $B$N3d$j9~$_%O%s%I%i$r8F$S=P$7(B $B$F$$$k$H;W$o$l$k4X?t$H9T?t$rEz$($J$5$$!#(B
      Last updated: 2011/02/07 23:07:21
      Yasushi Shinjo / <yas@is.tsukuba.ac.jp>