   I/O Ʈ α׷ ̴ Ͽ

  : Riku Saikkonen <Riku.Saikkonen@hut.fi < mailto:Riku.Saikko
  nen@hut.fi>>
   : 1997 3 30
  : ⵿̱ <kidong@opera.cse.cau.ac.kr
  <mailto:kidong@opera.cse.cau.ac.kr>>

    ۱ Riku Saikkonen ִ. ڼ  
  Ͽ  ۱  ϱ ٶ.   Ͽ  ϵ I/O
  Ʈ α׷ְ    x86 ư 
  α׷ ª Ⱓ ð  ٸ  Ѵ.   IO
  Ʈ ̴ Ͽ  ̴.  ϰų ÷  ִٸ,
    ڸ  ֱ ٶ.  (Riku.Saikkonen@hut.fi
  <mailto:Riku.Saikkonen@hut.fi>)...      (1996
  8 26)  ڿ ּҰ ٲ.  ڰ   iop
  erm()  fork() ؼ ޵ ʴ´.     
  ٷ (URL) ߰  ܿ ٸ  ȭ
  ______________________________________________________________________

  

  1. C α׷ I/O Ʈ, Ϲ 
  2. I/O Ʈ а  Ǵٸ 
  3. ͷƮ(IRQs) DMA 
  4. ػ Ÿ̹:  ð
  5. ػ Ÿ̹: ð ϱ
  6. ٸ α׷ 
  7.   Ʈ
  8.  ذ
  9. Ʈ 
  10. 帱 е

  ______________________________________________________________________

  1.  C α׷ I/O Ʈ, Ϲ 

  I/O а   ƾ /usr/include/asm/io.h ִ.  (Ǵ Ŀ
  ҽ    linux/include/asm-i386/io.h)    ƾ  ζ
  ũ̱  , #include <asm/io.h> ε  ϴ; ٸ
  ̺귯 ߰  ʿ  .

  gcc( ּ 2.7.2.1Ǵ   Ʒ )  , 
  ҽ ڵ  ؾ Ѵ. ȭ ɼ  Ͽ (gcc -O1 or 
  ), Ǵ ٸ  #including <asm/io.h>  #define extern
   ξ Ѵ.   ؼ,   "gcc -g -O"  
  ִ.  (ּ     gcc), ȭ  
  Ű  ̻ϰ    . װ صȴٸ,  ٸ
  ҽ Ͽ  I/O Ʈ а    ƾ ִ´. ׸
   ҽ ȭ ɼ ְ Ѵ.

   Ʈ а   , ݵ α׷ شϴ  ־
  Ѵ.  ̴  α׷     
  (  I/O Ʈ а  ) ioperm(2) Լ
  ȣν ̷. (unistd.h Ǿ ְ,  Ŀο ǵǾ
  ִ).   ioperm(from,num,turn_on)  ,  ⿡  from  а
     ù  °  Ʈ  ȣ̴.     ioperm(0x300,5,1); 
  Ʈ 0x300 0x304 ( 5 Ʈ)     ̴.
   ڴ Boolean   α׷ Ʈ    
  (true  (1)) ƴϸ   (false (0))  Ѵ. 
  ִ Ʈ    ϱ Ͽ ioperm   ȣ   ִ.
    Ͽ ڼ  ioperm(2) Ŵ  ϱ
  ٶ.

  ioperm() ȣ  α׷ Ʈ    ֱ⸦
  䱸Ѵ;     α׷ Ʈ ڷν  ϴ
  setuid  Ʈ ذ  ִ.  Ʈ  ϵ
  ioperm() ȣ Ŀ Ʈ     ִ. 
  ioperm(...,0) Ʈ   ݵ   ʿ䰡 ִ 
  ƴϴ. ̴ α׷ , ڵ ̷.  setuid()
  Ʈ ƴ  ڿ ioperm() ־ Ʈ    
   ƴϰ, fork() ׷  Ѵ.

  Ioperm() 0x000  0x3ff Ʈ  Ѵ;   
   ִ Ʈ, iopl(2) (̴ ѹ  Ʈ    
  ֵ Ѵ)   ʿ䰡  ִ. α׷  I/O Ʈ а
      Ͽ   3(  "iopl(3);")
  Ѵ (߸ Ʈ а     ǻͿ   ų
   Ƿ Ѵ). ٽ,   iopl() ȣϷ Ʈ 
  ʿϴ.

  ,  Ʈ   а µ, Ʈ  Ʈ
  Է¹ޱ  ؼ, inb(port); ȣϸ Ǵµ,  ̴  Ʈ
  Ѵ. Ʈ  Ʈ ϱ ؼ, outb(value, port);
  ȣѴ.  (Ű  Ѵ). Ʈ x x+1( 
  Ʈ 带 Ѵ,    INW )   
  (16Ʈ) Է¹ޱ  ؼ, inw(x); ȣ Ѵ.  Ʈ  
   带 ϱ ؼ,  outw(value,x) ȣ . 
   Ʈ  (Ʈ/) ؾ ϴ и ʴٸ,
   Ƹ inb()   outb() ʿ  ̴. -  κ
  ġ  Ʈ  Ʈ а  Ǿ ִ.   Ʈ
   ּ  ϴµ 1 ũ ʰ ɸٴ  Ѵ.

  inb_p(), outb_p(), inw_p(),  and outw_p() ũδ   ͵
  ϰ , ̵ Ʈ  а  Ŀ ª (1  ũ
   Ǵ)  ð ´;   <asm/io.h> #includeϱ
   REALLY_SLOW_IO  #define  ν 4 ũ 
  ϵ   ִ.  ̵ ũδ Ϲ  (#define
  SLOW_IO_BY_JUMPING   ʴ , ̰ ׷ Ȯ ʴ) 0x80
  Ʈ   ϹǷ,  0x80 Ʈ а  
  ֵ   ʿ䰡 ִ. ioperm()  (0x80 Ʈ  ý
  ٸ κп  ġ ʾƾ Ѵ).   ִ ٸ پ
   ڿ   ִ.

  ֱٿ ǥ    ioperm(), iopl() 
  ũο   Ŵ  ִ.

  2.  I/O Ʈ а  Ǵٸ 

  I/O Ʈ а  Ǵٸ  open() /dev/port ( ġ, ֹȣ
  1,  ȣ 4) а  ؼ (stdio.h f*(),   ǥ  
  ó Լ   ۸  ־,  ̵ Ѵ??). 
   lseek() Ͽ   ġŰµ ̰( ġ 0
  = Ʈ  0,  ġ 1 = Ʈ 1, ), ⼭  Ʈ 带 а
   Ͽ read() Ǵ write()  Ѵ.

  ,  α׷ /dev/port а  ʿ䰡 ִ.  
    ̴ ٴ   , ȭ ioperm() ʿ
    ʴ´. (  /dev/port Ϲ   ̳ ׷ 
  ־ , Ʈ   ʿ䰡 .)

  3.  ͷƮ(IRQs) DMA 

   - α׷   IRQ DMA   .
    Ŀ ̹ ۼ ʿ䰡  ִٸ ڼ װ Ŀ
  ҽ ڵ  

        Linux            Kernel           Hacker's            Guide

  (<www.redhat.com:8080/HyperNews/get/khg.html <http://www.red
  hat.com:8080/HyperNews/get/khg.html>>) о.   -
  α׷ ͷƮ ų  .

  4.  ػ Ÿ̹:  ð

  켱,    Ƽ½ŷ     μ
  Ÿ̹ Ȯ ϴ   ٴ Ϳ Ѵ. ٵ,
    μ Ƽ ½ŷ    Ư 
  Ȯ Ÿ̹    ٴ  ϰ  ʹ. 
  μ 10и ʿ (ε  ũ  ɸ ýۿ)  ʵ
  층 ܵ  ִ.  ׷, I/O Ʈ ϴ κ
   α׷ ̴    ʴ . ̷  ּȭ
  Ϸ  μ nice ɾ  켱  ο 
  ִ. (nice(2) Ŵ  ϱ ٶ).

  Ϲ    μ Ȯ Ÿ̹ Ű  Ѵٸ,
    ` Ÿ'   Ǿ Ѵ.  2.x
  Ŀο  Ʈ   Ÿ   Ǿ Ѵ; ڼ 
  sched_setscheduler(2)   Ѵ. ϵ  Ÿ  ϴ
  Ư Ŀ ִ. ̿     
  <URL:luz.cs.nmt.edu/~rtlinux/ <http://luz.cs.nmt.edu/~rtlinux/>>
  Ѵ.  ,   Ÿ̹ ȣ   . ʵ
  Ϸ, ּ  sleep(3) ϴ ̴. ּ  ʸ
  Ϸ (ּ  ð 10 и   ), usleep(3) ׷
   ̴. ̷  CPU ٸ μ ϵ
  ϹǷ, CPU Ÿ Ǵ   . ڼ  Ŵ 
  Ѵ.

  50и Ϸ   (μ ӽ,  ý Ͽ
  ¿),   췯   ޱ   ּ 10-30
  и  Ҹϱ  CPU    . ̷ 
  ,     ð  , usleep(3)  Ű 
     ּ 10и     Ѵ.

  ª  ð Ҵ   ( 50и   ̴), پϰ
      ִ     udelay()   ϴ  ε,
  /usr/include/asm/delay.h (linux/include/asm-i386/delay.h)  ǵǾ
  ִ.  udelay() Ű ϳ  ־  ϴµ  ũ
     ð ɸ, ƹ͵   ʴ´. Ű
   ͺ  ũ    ɸ   µ,  ̴ 󸶳
  ٷ  ϴ  ϴ 忡  Ե  ̴ (delay.h
  ڼ  ִ).

  Ŀ  ۿ  udelay() ϱ  ؼ,    Ȯ  
   unsigned long   loops_per_sec ʿ   ̴. ڰ
  ƴ  ,   Ŀο     /proc/cpuinfo
  BogoMips о 500000 ϴ ̴.

   Ŀ 2.0.x ø, ο ý ȣ nanosleep(2)
  (  ) ſ ª ð  ų ϵ   ִ.
  ̰ μ Ʈ   Ÿ 층(sched_setscheduler(2)
  ) Ѵٸ   ð 2 и   udelay(2)
  ϰ, ٸ 쿡 (usleep()  ) sleep  ȣѴ. 
  nanosleep() ϱ ؼ  loops_per_sec  ʿ  
  ε,  ý  ȣ   Ŀο   ̴.

   ũʵ ϴ Ǵٸ  Ʈ I/O̴.  Ʈ 0x80 
   Ʈ а  μ   ӵ  Ȯ 1
  ũ  ٷ Ѵ.  ũʵ ٸ ؼ 
   ȣ  ִ.  Ʈ  ǥ ӽſ  ؼ ɰ
  ۿ ٰ ȮѴ.) (׸ Ŀ ̹  ̸ Ѵ.)
  ̴ {in|out}[bw]_p()  ϴ ̴ (asm/io.h ).

  , κ  0-0x3ff Ʈ  Ʈ I/O  
  Ȯ 1 ũ  ϹǷ,      Ʈ
  Ȯ Ϸ  Ʈ  ð ֱ ؼ ߰ inb()
  ȣѴ.   α׷ ư μ  Ŭ  ӵ
  ˰ ִٸ, Ư    ɿ   ð   ª
  ð  (hard-code)  ִ(׷    ִٸ
  μ     Ƿ,   ð   
   ִٴ ̴). Ʒ ǥ    ӵ  Ŭ Ŭ
   Ѵ.   ,  50 MHz  μ (486DX-50 Ǵ
  486DX2-50) Ŭ Ŭ 1/50000000̴.

  ______________________________________________________________________
            i386 Ŭ Ŭ     i486 Ŭ Ŭ
  nop                   3                   1
  xchg %ax,%ax          3                   3
  or %ax,%ax            2                   1
  mov %ax,%ax           2                   1
  add %ax,0             2                   1
  ______________________________________________________________________

  (̾, Ƽ   𸥴. Ƹ 486  ̴.)
  (ڴ i386  Ŭ ϴ  ã  ) ǥ
  nop xchg  ۿ .   ÷ ͸ 
    , gcc װ ߰Ѵٰ   ʴ´.  ̸
  Ϸ, α׷  asm("");  ȣѴ.   ̺
    ִ  ش;    asm(" ;  ;
  ");   . asm() gcc ζ  ȯϿ Լ ȣ
  尡 .  Ƽ,    C ڵ, ֱٿ Ʈ
  Ͽ    Ŭ Ŭ    ִ.

  extern __inline__ unsigned long long int rdtsc() { unsigned long long
  int x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; }

   x86Űó  Ŭ Ŭ   ª  ð 
  Ұ ϴ.

  5.  ػ Ÿ̹: ð ϱ

  ʴ ð Ȯϰ ϴ , time(2) ϴ 
        ̴.  Ȯ ð,  gettimeofday(2)
  ũ  Ȯ Ѵ (층  ؼ κ
  Ѵ.) Ƽ  ڵ  Ŭ Ŭ Ȯϴ.
    μ    ð    Ŀ  ñ׳  ⸦
  Ѵٸ, setitimer(2) Ѵ. Ŵ  ڼ  
  ִ.

  6.  ٸ α׷ 

    C  α׷   д. ̴ C++  Objective
  C   Ǿ Ѵ.  ,  C ioperm()
  iopl()  ȣؾ ,  а    ִ I/O Ʈ   
  ְ  Ŀ  ׷  ̴.

  ٸ , α׷ ζ   C ڵ带  ʴ´ٸ,
      ʿ ϴ I/O Ʈ ٿ  Լ
   C     ۼϰ  α׷  ϰ ũϴ
     ̴.  Ǵ   Ѵ /dev/port Ѵ.

  7.    Ʈ

  ⿡  TTL  I/O   ̴ Ϲ Ʈ 
  α׷  ִ.

  з Ʈ (BASE = 0x3bc for /dev/lp0, 0x378 for /dev/lp1, and 0x278
  for  /dev/lp2):  (  ǥ    ó  ϴ  
  ʿϴٸ, Printing-HOWTO ) ڿ  ǥ    忡
  ٿ, κ  Ʈ 'Ȯ '  尡 ִ. 
  ο  ECP/EPP (Ϲ IEEE 1284 ǥ ̶     Ѵ)
       ,     <www.fapo.com/ <http://www.fapo.com/>>    
  <www.senet.com.au/~cpeacock/parallel.htm
  <http://www.senet.com.au/~cpeacock/parallel.htm>> ϸ  ȴ.
    - α׷ IRQ Ǵ DMA   
  ,   ECP/EPP ϴ Ŀ ̹ ߸ 
  ̶   Ѵ; ڴ  ̷ ̹  
  ̶ , ڼ    Ѵ.

  Ʈ BASE+0 ( Ʈ)  Ʈ (D0 to D7  0 7 Ʈ
  ش Ѵ.  0 = low (0 V), 1 = high (5 V))  ȣ
  Ѵ.  Ʈ  ͸   Ʈ ɿ ͸   ȴ.
  Ʈ а  Ǹ ǥ Ǵ Ȯ      
  Ǵ Ȯ б   ٸ ġ ɿ ͸ Ѵ.
  Ʈ BASE+1  ( Ʈ) б ,    Է ȣ
  ¸ Ѵ.

  Bits 0  1  Ǿ ִ.  Bit 2 IRQ  ( ƴϴ. ڵ
   ư  Ѵ.)  Bit 3 ERROR (1=high) Bit 4 SLCT
  (1=high) Bit 5 PE (1=high) Bit 6 ACK (1=high) Bit 7 -BUSY (0=high)
  (high low ¿ ؼ Ȯ  .)  Port BASE+2 (Control
  port) ⸸ ϰ(б⸦ õϸ    ϵȴ),
     ñ׳ Ѵ: Bit 0 -STROBE (0=high) Bit 1
  AUTO_FD_XT (1=high) Bit 2 -INIT (0=high) Bit 3 SLCT_IN (1=high) Bit  4
    Ʈ  IRQ    ϵ  Ѵ  (which  occurs  on  the
  low-to-high transition of ACK) when set to 1.  Bit 5 Ȯ  
  Ѵ (0  = , 1 = б), ⸸ ϴ(  Ʈ д 
    ).  Bits 6 7 Ǿ ִ.

  (ٽ ѹ , high low  ؼ Ȯ
  Ѵ.)   迭 (Ʈ 25-  D- Ŀ) (i=input, o=output):

  1io -STROBE, 2io D0, 3io D1, 4io D2, 5io D3, 6io D4, 7io D5, 8io D6,
  9io D7, 10i ACK,  11i -BUSY, 12i  PE, 13i  SLCT, 14o AUTO_FD_XT,  15i
  ERROR, 16o -INIT, 17o SLCT_IN, 18-25 Ground

  IBM   1, 14, 16, 17(  )    collector
  ̹ 4.7 ųο   ؼ 5V   øٰ Ѵ.
  (sink 20 mA,  source 0.55 mA,   5.0  V - pullup). 
  ɵ sink 24 mA,  source 15 mA, and   ּ  2.4 V. 
   low ¿ ִ 0.5 V  . IBM Űó  ƴ  
  Ʈ   ǥ   ̴.   ڼ  Ʒ
  Ѵ.

  <www.hut.fi/~then/circuits/lptpower.html
  <http://www.hut.fi/~then/circuits/lptpower.html>>.  , :
     ϵ Ѵ.  ڴ ǻͰ      ؼ
   Ʈ   ߷ȴ.  ̷ 쿡 忡 յǾ  
    Ʈ ϴ    δ. ( ι°
    ǥ `Ƽ-IO'ī忡   Ʈ   ִ; ʿ  
  Ʈ   Ѵ, ׸  ī  Ʈ ּҸ   ִ
  ּҷ ´.  Ʈ IRQ ؼ  ʿ ,  
   ʱ ̴.   (̽ƽ) Ʈ (0x200-0x207 Ʈ): (Ϲ
  ̽ƽ ϹǷ, Ŀ-  ̽ƽ ̹ ִ.
  te.unc.edu/pub/Linux/kernel/patches/
  <http://te.unc.edu/pub/Linux/kernel/patches/>ystick-*  Ѵ.)
   迭 (Ʈ 15  D- Ŀ):

  1,8,9,15: +5 V (Ŀ) 4,5,12:  2,7,10,14:  BA1, BA2, BB1,
  BB2  Է 3,6,11,13:  AX, AY, BX, BY, Ƴα Է

  +5 V      Ǵ  δ, ׷ 
   ó (?)  ־ Ѵ. 忡 ϴ, Ŀ
  ö̿  Ʈ  Է  Ʈ ϴ  ̽ƽ
  ư δ. (̽ƽ A ̽ƽ B,  ư ΰ) ̵ 
  TTL-  Է Ǿ ϰ,   Ʈ   ¸  
  ִ(Ʒ  ).  ̽ƽ ư  low(0V)  ¸,
  ٸ 쿡 high  (1ų   Ͽ   ɿ 5V)
  Ѵ.

  ̸ Ƴα Է   Ѵ.  Ʈ    Է¿
        Ⱑ ִ.  Է¿, Է ɰ 
     2.2 ųο  ִ.    . 
  ̽ƽ  ึ 踦 ϰ ְ  (X Y), +5V  ˸
  Է   ̿ Ǿ  ִ.(̽ƽ A  AX Ǵ AY ְ,
  ̽ƽ B BX Ǵ BY ִ).   Ⱑ  Ȱȭ Ǿ 
     High          Ÿ̹
  ܵ 3.3V   ٸ.      
     ̽ƽ 迡 ִ ׿  Ѵ.(
  ,  ࿡ ̽ƽ ġ)  :

  R = (t - 24.2) / 0.011,

  R  ̰ t    ð ʸ 
  Ѵ.  , Ƴα  Է ,  켱   ⸦ Ȱȭ
  Ѿ ϰ (port white Բ, Ʒ )  (Ʈ  鼭)
    °      ٷ(polling)
  Ѵ. ̷ polling CPU    ϰ    ǽð
  Ƽ½ŷ  ʴ ý , Ʈ  ٸ 
  Ƿ  ׸ Ȯ  ʴ. ( Ŀ  ̹
  Ͽ polling ϴ  ͷƮ  ʴ   ׷,
    CPU ð   ҸѴ.)  ȣ  ð( 
  и)  ̶  ȴٸ,  pollingϱ  CPU ð
  ٸ μ ֱ Ͽ usleep() ȣ  ִ.

   а ⸦ ϴ  I/O Ʈ 0x201 ̴(ٸ Ʈ
      ϰų ƹ͵  ʴ´).  Ʈ
  ⸦ ϸ (    ߿ ʴ)  Ⱑ
  Ȱȭȴ.  Ʈ  Է ñ׳ ¸ Ѵ.

  Bit 0: AX (status (1=high) of the multivibrator output) Bit 1: AY
  (status (1=high) of the multivibrator output) Bit 2: BX (status
  (1=high) of the multivibrator output) Bit 3: BY (status (1=high) of
  the multivibrator output) Bit 4: BA1 (digital input, 1=high) Bit 5:
  BA2 (digital input, 1=high) Bit 6: BB1 (digital input, 1=high) Bit 7:
  BB2 (digital input, 1=high)

   Ʈ:   Ϸ ġ RS-232 Ҵٸ, 
     Ʈ   ־ Ѵ.    ̹ κ
     ׷ ʿ δ ϴ. (  Ʈ
      Ѵ; ·,  ̷  ϴ Ŀ
  ̹ ۼؾ   .);   Ʈ ſ پ 뵵
  ̴µ, ǥ bps   Ͽ  Ű ʴ´.

  н ý  Ʈ α׷ֿ    ڼ 
  termios(3)    , ø  ̹  ҽ
  ڵ(/usr/src/linux/drivers/char/serial.c),
  <www.easysw.com/~mike/serial/index.html
  <http://www.easysw.com/~mike/serial/index.html>> Ѵ.  
   Ƴα I/O Ѵٸ,   ADC DACĨ  Ʈ 
    ִ. (Ʈ: Ŀ ؼ  Ʈ Ŀ Ǵ ǻ
    ٱ ϴ  ũ ̺  Ŀ Ŀ͸
  Ѵ,     ġ ϰų Ŀ   Ʈ
  ü   ִ  ƴ϶) Ǵ, AD/DA ī带 Ѵ(
   ī κ I/O  Ʈ Ѵ). Ȯϰ 
  ҾԿ      äο  ٸ,  
  ̹  Ǵ   ī嵵   ִ.  (̴ 
  .)

  ٸ Ʈ:    Ʈ  ȸ   Ʈ
  ã ִٸ, Pcb Ҹ   X11  α׷ ִµ,  
   ̴.  ־   ؼ ƹ͵    
  ִ.       α׷                
  ԵǾ     ְ, ite.unc.edu/pub/Linux/apps/circuits/
  <http://ite.unc.edu/pub/Linux/apps/circuits/>pcb-*   ִ.

  8.   ذ

  Q1. Ʈ Ϸ   segmentation faults  .

  A1.  α׷ Ʈ     ʰų ioperm()
  ȣ      Ͽ ̴.  ioperm() ϰ
  غ.  ,  ioperm() а Ⱑ  Ʈ
  ϴ  Ѵ.

  Q2. 𿡼  in*(), out*() ǵ Լ  ã  .  gcc
  undefined references Ѵ.

  A2.   ȭ  ɼ(-O)    ʰ   Ͽ,  
  gcc asm/io.h ũθ м  . Ǵ #include <asm/io.h>
   ʾҴ.

  Q3. out*() ƹ͵  ʰų, ̻ϰ Ѵ.

  A3.  Ű    Ѵ;  
  outportb(port,value)  ƴ outb(value,port) Ǿ Ѵ.

  Q4. ǥ RS-232 Ʈ/ /̽ƽ ϰ ʹ.

  A4.  ̹ ϴ ̹ ( Ŀ Ǵ X 
  򰡿  ) ϴ  .   ̹ ſ پ
      ־, ǥ ġ ۽Ű⵵  Ѵ.  
  ϰ ִ ǥ  Ʈ   Ѵ.

  9.  Ʈ 

  ⿡ I/O Ʈ Ҽ ִ   ڵ尡 ִ.

  ______________________________________________________________________
  /*
   * example.c:  Ʈ  
   *
   *  ڵ Ư    , Ʈ ,   ,
   * Ʈ д´. `gcc -O2 -o example example.c' Ѵ.
   */
  #include <stdio.h>
  #include <unistd.h>
  #include <asm/io.h>
  #define BASEPORT 0x378 /* lp1 */
  int main()
  {
    /* Get access to the ports */
    if (ioperm(BASEPORT,3,1)) {perror("ioperm");exit(1);}

    /* Set the data signals (D0-7) of the port to all low (0) */
    outb(0,BASEPORT);

    /* Sleep for a while (100 ms) */
    usleep(100000);

    /* Read from the status port (BASE+1) and display the result */
    printf("status: %d\n",inb(BASEPORT+1));
    /* We don't need the ports anymore */
    if (ioperm(BASEPORT,3,0)) {perror("ioperm");exit(1);}
    exit(0);
  }
  /* end of example.c */
  ______________________________________________________________________

  10.  帱 е

   ϱ⿡ ʹ  е  Ǿ,  ſ
  Ѵ.      е鲲   Ͽ. ̿ 
  ˼۽  , ٽ ѹ  ֽɿ 帰.   I/O
  Ʈ α׷ ̴ Ͽ 

