¦p¦ó¦b Linux ¤U¼¶¼gµ{¦¡¨Ó¨Ï¥Î I/O °ð §@ªÌ: Riku Saikkonen <Riku.Saikkonen@hut.fi> ĶªÌ: Da-Wei Chiang <dawei@sinica.edu.tw> v, 28 December 1997 ½Ķ¤é´Á: 22 Jul. - 1 Aug. 1998 _________________________________________________________________ ¥»¤åªº¤º®e»¡©ú¤F Intel x86 ¬[ºc¤U¦p¦ó¦b¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ¤¤¼¶¼gµ{ ¦¡¨Ó¨Ï¥ÎµwÅéI/O °ð¥H¤Îµ¥«Ý¤@¤p¬qªº®É¶¡©P´Á. _________________________________________________________________ 1. ¤¶²Ð 2. ¦p¦ó¦b C »y¨¥¤U¨Ï¥Î I/O °ð * 2.1 ¥¿³Wªº¤èªk * 2.2 ¥t¤@Ó´À¥Nªº¤èªk: /dev/port 3. µwÅ餤Â_ (IRQs) »P DMA ¦s¨ú 4. °ªºë½Tªº®É§Ç * 4.1 ©µ¿ð®É¶¡ * 4.2 ®É¶¡ªº¶q´ú 5. ¨Ï¥Î¨ä¥Lµ{¦¡»y¨¥ 6. ¤@¨Ç¦³¥Îªº I/O °ð * 6.1 ¨Ã¦C°ð (parallel port) * 6.2 ¹CÀ¸ (¾ÞÁa±ì) °ð (game port) * 6.3 ¦ê¦C°ð (serial port) 7. ´£¥Ü 8. °ÝÃD±Æ°£ 9. µ{¦¡½X½d¨Ò 10. PÁ _________________________________________________________________ 1. ¤¶²Ð ¥»¤åªº¤º®e»¡©ú¤F Intel x86 ¬[ºc¤U¦p¦ó¦b¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ¤¤¼¶¼gµ{ ¦¡¨Ó¨Ï¥ÎµwÅé I/O °ð¥H¤Îµ¥«Ý¤@¤p¬qªº®É¶¡©P´Á. ¤º®e·½¦Û©ó¤@½g«D±`µuªº¤å³¹ IO-Port mini-HOWTO ¨ä§@ªÌ»P¥»¤å¦P. ¥»¤å 1995-1997 ªºª©ÅvÄÝ©ó Riku Saikkonen ©Ò¦³. ª©ÅvÁn©ú¸Ô¨£ºô¶ [1]Linux HOWTO copyright. ¦pªG±z¹ï¥»¤å¦³¥ô¦ó«ü±Ð¤£½×¬O¿ù»~×¥¿©Î¬O¤º®e¸Éz, ³£Åwªï±H«Hµ¹§Ú (Riku.Saikkonen@hut.fi)... ¥»¤å¹ï«e¤@¦¸µo¦æªºª©¥» (Mar 30 1997) §@¤F¦p¤Uªº×¥¿: * ¹ï©ó inb_p/outb_p ©M°ð¦ì§} 0x80 ¤§¶¡ªºÃö«Y°µ¥X¤F¼á²M. * §R°£¤FÃö©ó udelay() ¨ç¦¡ªº¸ê®Æ, ¦]¬° nanosleep() ¨ç¦¡ ´£¨Ñ¤F¤ñ¸û©ú ½Tªº¨Ï¥Î¤èªk. * ±N¤º®eÂà´«¦¨ Linuxdoc-SGML ®æ¦¡, ¨Ã¥B«·s§@¤F¨Ç³\ªº½s±Æ. * ¹ï«Ü¦h¦a¤è§@¤F¨Ç³\ªº¸Éz»P×¥¿. 2. ¦p¦ó¦b C »y¨¥¤U¨Ï¥Î I/O °ð 2.1 ¥¿³Wªº¤èªk ¥Î¨Ó¦s¨ú I/O °ðªº±`¦¡ (Routine) ³£©ñ¦bÀÉ®× /usr/include/asm/io.h ¸Ì (©Î ©ñ¦b®Ö¤ßì©l½Xµ{¦¡¶°ªº linux/include/asm-i386/io.h Àɮ׸Ì). ³o¨Ç±`¦¡¬O ¥H³æ¦æ¥¨¶° (inline macros) ªº¤è¦¡¼g¦¨ªº, ©Ò¥H¨Ï¥Î®É¥un¥H #include <asm/io.h> ªº¤è¦¡¤Þ¥Î´N°÷¤F; ¤£»Ýnªþ¥[¥ô¦ó¨ç¦¡À] (libraries). Ķª`: ±`¦¡(Routine) ³q±`¬O«ü¨t²Î©I¥s(System Call)»P¨ç¦¡(Function)ªºÁ` ºÙ. ¦]¬° gcc (¦Ü¤Ö¥X²{¦b 2.7.2.3 ©M¥H«eªºª©¥») ¥H¤Î egcs (©Ò¦³ªºª©¥») ªº ¨î, §A¦b½sĶ¥ô¦ó¨Ï¥Î¨ì³o¨Ç±`¦¡ªºì©l½X®É ¥²¶· ¥´¶}³Ì¨Î¤Æ¿ï¶µ (gcc -O1 ©Î¸û°ª¼h¦¸ªº), ©ÎªÌ¬O¦b°µ #include <asm/io.h> ³oӰʧ@«e¨Ï¥Î #define extern ±N extern ©w¸q¦¨ªÅ¥Õ. ¬°¤F°£¿ùªº¥Øªº, §A½sĶ®É¥i¥H¨Ï¥Î gcc -g -O (¦Ü¤Ö²{¦bªº gcc ª©¥»¬O³o ¼Ë), ¦ý¬O³Ì¨Î¤Æ¤§«á¦³®É¥i¯à·|Åý°£¿ù¾¹ (debugger) ªº¦æ¬°Åܪº¦³ÂI©_©Ç. ¦p ªG³oÓª¬ªp¹ï§A¦Ó¨¥¬OÓ§xÂZ, §A¥i¥H±N©Ò¦³¨Ï¥Î¨ì I/O °ðªº±`¦¡¶°¤¤©ñ¦b¤@Ó Àɮ׸̨åu¦b½sĶ¸ÓÀÉ®×®ÉÅ×¥´¶}³Ì¨Î¤Æ¿ï¶µ. ¦b§A¦s¨ú¥ô¦ó I/O °ð¤§«e, §A¥²¶·Åý§Aªºµ{¦¡¦³¦p¦¹°µªºÅv. n¹F¦¨³oӥتº §A¥i¥H¦b§Aªºµ{¦¡¤@¶}©lªº¦a¤è (¦ý¬On¦b¥ô¦ó I/O °ð¦s¨ú°Ê§@¤§«e) ©I¥s ioperm() ³oӨ禡 (¸Ó¨ç¦¡³Q«Å§i©óÀÉ®× unistd.h , ¨Ã¥B³Q©w¸q¦b ®Ö¤ß¤¤). ¨Ï¥Î»yªk¬O ioperm(from, num, turn_on), ¨ä¤¤ from ¬O²Ä¤@Ó¤¹³\¦s¨úªº I/O °ð¦ì§}, num ¬O±µµÛ³sÄò¦s¨ú I/O °ð¦ì§}ªº¼Æ¥Ø. ¨Ò¦p, ioperm(0x300, 5, 1) ªº·N«ä´N¬O»¡¤¹³\¦s¨ú°ð 0x300 ¨ì 0x304 (¤@¦@¤Ó°ð¦ì§}). ¦Ó³Ì«á¤@ ӰѼƬO¤@Ó¥¬ªL¥N¼ÆȥΨӫü©w¬O§_ µ¹¤©µ{¦¡¦s¨ú I/O °ðªºÅv (true (1)) ©Î¬O°£¥h¦s¨úªºÅv (false (0)). §A ¥i¥H¦h¦¸©I¥s¨ç¦¡ ioperm() ¥H«K ¨Ï¥Î¦hÓ¤£³sÄòªº°ð¦ì§}. ¦Ü©ó»yªkªº²Ó¸`½Ð °Ñ¦Ò ioperm(2) ªº¨Ï¥Î»¡©ú¤å ¥ó. §Aªºµ{¦¡¥²¶·¾Ö¦³ root ªºÅvÅׯà©I¥s¨ç¦¡ ioperm() ; ©Ò¥H§A¦pªG¤£¬O¥H root ªº¨¥÷°õ¦æ¸Óµ{¦¡, ´N¬O±o±N¸Óµ{¦¡ setuid ¦¨ root. ·í§A©I¥s¹L¨ç¦¡ ioperm() ¥´¶} I/O °ðªº¦s¨úÅv«á§A«K¥i¥H®³±¼ root ªºÅv. ¦b§Aªºµ{¦¡µ² §ô¤§«á¨Ã¤£¯S§O n¨D§A¥H ioperm(..., 0) ³oӤ覡®³±¼ I/O °ðªº¦s¨úÅv; ¦]¬°·í§Aªºµ{¦¡ °õ¦æ§¹²¦¤§«á³oӰʧ@·|¦Û°Ê§¹¦¨. ©I¥s¨ç¦¡ setuid() ±N¥Ø«e°õ¦æµ{¦¡ªº¦³®Ä¨Ï¥ÎªÌÃѧO½X (ID) ³]©w¦¨«D root ªº¨Ï¥ÎªÌ¨Ã¤£¼vÅT¨ä¥ý«e¥H ioperm() ªº¤è¦¡©Ò¨ú±oªº I/O °ð¦s¨úÅv, ¦ý¬O©I ¥s¨ç¦¡ fork() ªº¤è¦¡«o·|¦³©Ò¼vÅT (ÁöµM¤÷¦æµ{ (parent process) «O¦³¦s¨ú Åv, ¦ý¬O¤l¦æµ{ (child process) «oµLªk¨ú±o¦s¨úÅv). ¨ç¦¡ ioperm() ¥u¯àÅý§A¨ú±o°ð¦ì§} 0x000 ¨ì 0x3ff ªº¦s¨úÅv; ¦Ü©ó ¸û°ª¦ì §}ªº°ð, §A±o¨Ï¥Î¨ç¦¡ iopl() (¸Ó¨ç¦¡Åý§A¤@¦¸¥i¥H¦s¨ú©Ò¦³ªº°ð¦ì§}). ±NÅv µ¥¯Å°Ñ¼Æȳ]¬° 3 (¨Ò¦p, iopl(3)) ¥H«K§Aªºµ{¦¡¯à°÷¦s¨ú ©Ò¦³ªº I/O °ð (¦]¦¹n¤p¤ß --- ¦pªG¦s¨ú¨ì¿ù»~ªº°ð¦ì§}±N¹ï§Aªº¹q¸£³y¦¨¦UºØ¤£¥i¹w´Áªº·l ®`. ¦P¼Ë¦a, ©I¥s¨ç¦¡ iopl() §A±o¾Ö¦³ root ªºÅv.¦Ü©ó»yªkªº²Ó¸`½Ð°Ñ¦Ò iopl(2) ªº¨Ï¥Î»¡©ú¤å¥ó. ±µµÛ, §Ų́ӹê»Ú¦a¦s¨ú I/O °ð... n±q¬YÓ°ð¦ì§}¿é¤J¤@Ó byte (8 Ó bits) ªº¸ê®Æ, §A±o©I¥s¨ç¦¡ inb(port) , ¸Ó¨ç¦¡·|¶Ç¦^©Ò¨ú±oªº¤@Ó byte ªº ¸ê®Æ. n¿é¥X¤@Ó byte ªº¸ê®Æ, §A±o©I¥s¨ç¦¡ outb(value, port) (½Ð°O¦í°Ñ ¼Æªº¦¸§Ç). n±q¬Y¤GÓ°ð¦ì§} x ©M x+1 (¤GÓ byte ²Õ¦¨¤@Ó word, ¬G¨Ï¥Î²Õ ¦X»y¨¥ «ü¥O inw) ¿é¤J¤@Ó word (16 Ó bits) ªº¸ê®Æ, §A±o©I¥s¨ç¦¡ inw(x) ; n¿é¥X¤@Ó word ªº¸ê®Æ¨ì¤GÓ°ð¦ì§}, §A±o©I¥s¨ç¦¡ outw(value, x) . ¦pªG§A¤£½T©w¨Ï¥Î¨ºÓ°ð«ü¥O (byte ©Î word), §A¤j·§¶·n inb() »P outb() ³o¤GÓ°ð«ü¥O --- ¦]¬°¤j¦h¼Æªº¸Ë¸m³£¬O±Ä¥Î byte ¤j¤pªº°ð¦s¨ú¤è¦¡ ¨Ó³]pªº. ª`·N©Ò¦³ªº°ð¦s¨ú«ü¥O³£¦Ü¤Ö»Ýn¤j¬ù¤@·L¬íªº®É¶¡¨Ó°õ¦æ. ¦pªG§A¨Ï¥Îªº¬O inb_p(), outb_p(), inw_p(), ¥H¤Î outw_p() µ¥¥¨¶°«ü¥O, ¦b §A¹ï°ð¦ì§@§}¦s¨ú°Ê§@¤§«á¥u»Ý«Üµuªº(¤j¬ù¤@·L¬í)©µ¿ð®É¶¡´N¥i¥H§¹¦¨; §A¤] ¥i¥HÅý©µ¿ð®É¶¡Åܦ¨¤j¬ù¥|·L¬í¤èªk¬O¦b¨Ï¥Î #include <asm/io.h> ¤§«e¨Ï¥Î #define REALLY_SLOW_IO. ³o¨Ç¥¨¶°«ü¥O³q±` (°£«D§A¨Ï¥Îªº¬O #define SLOW_IO_BY_JUMPING, ³oÓ¤èªk¥i¯à¸û¤£·Ç½T) ·|§Q¥Î¿é¥X¸ê®Æ¨ì°ð¦ì§} 0x80 ¥H«K¹F¨ì©µ¿ð®É¶¡ªº¥Øªº, ©Ò¥H§A±o¥ý¥H¨ç¦¡ ioperm() ¨ú±o°ð¦ì§} 0x80 ªº¨Ï ¥ÎÅv (¿é¥X¸ê®Æ¨ì°ð¦ì§} 0x80 ¤£À³¸Ó·|¹ï¨t²Îªº¨ä¥L¨ä¥L³¡¤À³y¦¨¼vÅT). ¦Ü ©ó ¨ä¥L³q¥Îªº©µ¿ð®É¶¡ªº¤èªk, ½ÐÄ~ÄòŪ¤U¥h. ioperm(2), iopl(2) µ¥¨ç¦¡, ©M¤W±©Òz¤Îªº¥¨¶°«ü¥Oªº¨Ï¥Î»¡©ú·|¦¬¿ý¦b ³Ì ªñ¥Xª©ªº Linux ¨Ï¥Î»¡©ú¤å¥ó¶°¤¤. 2.2 ¥t¤@Ó´À¥Nªº¤èªk: /dev/port ¥t¤@Ó¦s¨ú I/O °ðªº¤èªk¬O¥H¨ç¦¡ open() ¶}±ÒÀÉ®× /dev/port (¤@Ó¦r¤¸¸Ë ¸m,¥Dn¸Ë¸m½s¸¹¬° 1, ¦¸n¸Ë¸m½s¸¹¬° 4) ¥H«K°õ¦æŪ¥B/©Î¼gªº°Ê§@ (ª`·N¼Ð ·Ç¿é¥X¤J (stdio) ¨ç¦¡ f*() ¦³¤º³¡ªº½w½Ä (buffering), ©Ò¥HnÁקK¨Ï¥Î). ±µµÛ¨Ï¥Î lseek() ¨ç¦¡¥H«K¦b¸Ó¦r¤¸¸Ë¸mÀɮפ¤§ä¨ì¬YÓ byte ¸ê®Æªº¥¿½T¦ì¸m (Àɮצì¸m 0 = °ð¦ì§} 0x00, Àɮצì¸m 1 = °ð¦ì§} 0x01, ¥H¦¹Ãþ±À), µM«á§A ¥i¥H¨Ï¥Î read() ©Î write() ¨ç¦¡¹ï¬YÓ°ð¦ì§}°µÅª©Î¼g¤@Ó byte ©Î word ¸ê ®Æªº°Ê§@. ³oÓ´À¥Nªº¤èªk´N¬O¦b§Aªºµ{¦¡¸Ì¨Ï¥Î read/write ¨ç¦¡¨Ó¦s¨ú /dev/port ¦r¤¸ ¸Ë¸mÀÉ®×. ³oÓ¤èªkªº°õ¦æ³t«×©Î³\¤ñ«e±©ÒÁ¿ªº¤@¯ë¤èªkÁÙºC, ¦ý¬O¤£»Ýn½s Ķ¾¹ ªº³Ì¨Î¤Æ¥\¯à¤]¤£»Ýn¨Ï¥Î¨ç¦¡ ioperm() . ¦pªG§A¤¹³\«D root ¨Ï¥ÎªÌ©Î ¸s²Õ¦s¨ú /dev/port ¦r¤¸³]¸Ë¸m®×, ¾Þ§@®É´N¤£»Ý¾Ö¦³ root Åv -- ¦ý¬O¹ï©ó ¨t²Î¦w¥þ¦Ó¨¥ ¬OÓ«D±`ÁV¿|ªº¨Æ±¡, ¦]¬°¥L¥i¯à¶Ë®`¨ì§Aªº¨t²Î, ©Î³\·|¦³¤H¦] ¦Ó¨úªº root ªºÅv, §Q¥Î /dev/port ¦r¤¸¸Ë¸mÀɮת½±µ¦s¨úµwºÐ, ºô¸ô¥d, µ¥ ³]³Æ. 3. µwÅ餤Â_ (IRQs) »P DMA ¦s¨ú §Aªºµ{¦¡¦pªG¦b¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ¤U°õ¦æ¤£¥i¥Hª½±µ¨Ï¥ÎµwÅ餤Â_ (IRQs) ©Î DMA. §A¥²»Ý¼¶¼g¤@Ó®Ö¤ßÅX°Êµ{¦¡; ¬ÛÃöªº²Ó¸`½Ð°Ñ¦Òºô¶ [2]The Linux Kernel Hacker's Guide ¥H¤Î®³®Ö¤ßµ{¦¡ì©l½X¨Ó·í½d¨Ò. ¤]´N¬O»¡, §A¦b¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ¤¤©Ò¼gªºµ{¦¡µLªk§í¨îµwÅ餤Â_ªº²£ ¥Í. 4. °ªºë½Tªº®É§Ç 4.1 ©µ¿ð®É¶¡ º¥ý, §Ú·|»¡¤£«OÃÒ§A¦b¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ¤¤°õ¦æªº¦æµ{ (process) ¯à °÷ºë½T¦a±±¨î®É§Ç¦]¬° Linux ¬OÓ¦h¤uªº§@·~Àô¹Ò. §A¦b°õ¦æ¤¤ªº¦æµ{ (process) ÀH®É·|¦]¬°¦UºØì¦]³Q¼È°±¤j¬ù 10 ²@¬í¨ì¼Æ¬í (¦b¨t²Ît²ü«D±`°ª ªº®ÉÔ). µM¦Ó, ¹ï©ó¤j¦h¼Æ¨Ï¥Î I/O °ðªºÀ³¥Î¦Ó¨¥, ³oÓ©µ¿ð®É¶¡¹ê»Ú¤Wºâ¤£ ¤F¤°»ò. nÁYµu©µ¿ð®É¶¡, §A±o¨Ï¥Î¨ç¦¡ nice ±N§A¦b°õ¦æ¤¤ªº¦æµ{ (process ) ³]©w¦¨°ªÀu¥ýÅv(½Ð°Ñ¦Ò nice(2) ¨Ï¥Î»¡©ú¤å¥ó) ©Î¨Ï¥Î§Y®É±Æµ{ªk (real-time scheduling) (½Ð¬Ý¤U±). ¦pªG§A·QÀò±o¤ñ¦b¤@¯ë¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ¤¤°õ¦æªº¦æµ{ (process) ÁÙn ºë½Tªº®É§Ç, ¦³¤@¨Ç¤èªk¥i¥HÅý§A¦b¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ¤¤°µ¨ì `§Y®É' ±Æ µ{ªº¤ä´©. Linux 2.x ª©¥»ªº®Ö¤ß¤¤¦³³nÅé¤è¦¡ªº§Y®É±Æµ{¤ä´©; ¸Ô²Óªº»¡©ú½Ð °Ñ¦Ò sched_setscheduler(2) ¨Ï¥Î»¡©ú¤å¥ó. ¦³¤@Ó¯S®íªº®Ö¤ß¤ä´©µwÅ骺§Y®É ±Æµ{; ¸Ô²Óªº¸ê°T½Ð°Ñ¦Òºô¶ [3]http://luz.cs.nmt.edu/~rtlinux/ ¥ð®§¤¤ (Sleeping) : sleep() »P usleep() ²{¦b, Åý§Ú̶}©l¸û²³æªº®É§Ç¨ç¦¡©I¥s. ·Qn©µ¿ð¼Æ¬íªº®É¶¡, ³Ì¨Îªº¤èªk¤j ·§ ¬O¨Ï¥Î¨ç¦¡ sleep() . ·Qn©µ¿ð¦Ü¤Ö¼Æ¤Q²@¬íªº®É¶¡ (10 ms ¦ü¥G¤w¬O³Ìµu ªº ©µ¿ð®É¶¡¤F), ¨ç¦¡ usleep() À³¸Ó¥i¥H¨Ï¥Î. ³o¨Ç¨ç¦¡¬OÅý¥X CPU ªº¨Ï¥ÎÅv µ¹¨ä¥L·Qn°õ¦æªº¦æµ{ (processes) (``¦Û¤v¥ð®§¥h¤F''), ©Ò¥H¨S¦³®ö¶O±¼ CPU ªº®É¶¡. ²Ó¸`½Ð°Ñ¦Ò sleep(3) »P usleep(3) ªº»¡©ú¤å¥ó. ¦pªGÅý¥X CPU ªº¨Ï¥ÎÅv¦]¦Ó¨Ï±o®É¶¡©µ¿ð¤F¤j¬ù 50 ²@¬í (³o¨ú¨M©ó³B²z¾¹»P¾÷ ¾¹ªº³t«×, ¥H¤Î¨t²Îªºt²ü), ´N®ö¶O±¼ CPU ¤Ó¦hªº®É¶¡, ¦]¬° Linux ªº±Æµ{¾¹ (scheduler) (³æ´N x86 ¬[ºc¦Ó¨¥) ¦b±N±±¨îÅvµoÁÙµ¹§Aªº¦æµ{ (process) ¤§«e ³q±`¦Ü¤Önªá¶O 10-30 ²@¬íªº®É¶¡. ¦]¦¹, µu®É¶¡ªº©µ¿ð, ¨Ï¥Î¨ç¦¡ usleep(3) ©Ò±o¨ìªº©µ¿ðµ²ªG³q±`·|¤j©ó§A¦b°Ñ¼Æ©Ò«ü©wªºÈ, ¤j¬ù¦Ü¤Ö¦³ 10 ms. nanosleep() ¦b Linux 2.0.x ¤@¨t¦Cªº®Ö¤ßµo¦æª©¥»¤¤, ¦³¤@Ó·sªº¨t²Î©I¥s (system call), nanosleep() (½Ð°Ñ¦Ò nanosleep(2) ªº»¡©ú¤å¥ó), ¥LÅý§A¯à°÷ ¥ð®§©Î ©µ¿ð¤@Óµuªº®É¶¡ (¼Æ·L¬í©Î§ó¦h). ¦pªG©µ¿ðªº®É¶¡ <= 2 ms, Y(¥B°ßY)§A°õ¦æ¤¤ªº¦æµ{ (process) ³]©w¤F³nÅ骺 §Y®É ±Æµ{ (´N¬O¨Ï¥Î¨ç¦¡ tt/sched_setscheduler()/), ©I¥s¨ç¦¡ nanosleep() ®É ¤£¬O¨Ï¥Î¤@Ó¦£¸L°j°é¨Ó©µ¿ð®É¶¡; ´N¬O·|¹³¨ç¦¡ usleep() ¤@ ¼ËÅý¥X CPU ªº¨Ï¥ÎÅv¥ð®§¥h¤F. ³oÓ¦£¸L°j°é¨Ï¥Î¨ç¦¡ udelay() (¤@ÓÅX°Êµ{¦¡±`·|¥Î¨ìªº®Ö¤ß¤º³¡ªº¨ç¦¡) ¨Ó ¹F¦¨, ¨Ã¥B¨Ï¥Î BogoMips È (BogoMips ¥i¥H·Ç½T¶q´ú³oÃþ¦£¸L°j°éªº³t«×) ¨Ó pºâ°j°é©µ¿ðªº®É¶¡ªø«×. ¨ä¦p¦ó°Ê§@ªº²Ó¸`½Ð°Ñ¦Ò /usr/include/asm/delay.h). ¨Ï¥Î I/O °ð¨Ó©µ¿ð®É¶¡ ¥t¤@Ó©µ¿ð¼Æ·L¬íªº¤èªk¬O¨Ï¥Î I/O °ð. ´N¬O±q°ð¦ì§} 0x80 ¿é¤J©Î¿é¥X¥ô¦ó byte ªº¸ê®Æ (½Ð°Ñ¦Ò«e±) µ¥«Ýªº®É¶¡À³¸Ó´X¥G¥un 1 ·L¬í³on¬Ý§Aªº³B²z¾¹ ªº«¬§O»P³t«×. ¦pªGn©µ¿ð¼Æ·L¬íªº®É¶¡§A¥i¥H±N³oӰʧ@¦h°µ´X¦¸. ¦b¥ô¦ó¼Ð ·Çªº¾÷¾¹¤W¿é¥X¸ê®Æ¨ì¸Ó °ð¦ì§}À³¸Ó¤£·|¦³¤£¨}ªº«áªGÅ×¹ï (¦Ó¥B¦³¨Ç®Ö¤ßªº³] ³ÆÅX°Êµ{¦¡¤]¦b¨Ï¥Î¥L). {in|out}[bw]_p() µ¥¨ç¦¡´N¬O¨Ï¥Î³oÓ¤èªk¨Ó²£¥Í®É ¶¡©µ¿ðªº (½Ð°Ñ¦ÒÀÉ®× asm/io.h). ¹ê»Ú¤W, ¤@ӨϥΨì°ð¦ì§}½d³ò¬° 0-0x3ff ªº I/O °ð«ü¥O´X¥G¥un 1 ·L¬íªº®É ¶¡, ©Ò¥H¦pªG§An¦p¦¹°µ, ¨Ò¦p, ª½±µ¨Ï¥Î¨Ã¦C°ð, ¥un¥[¤W´XÓ inb() ¨ç¦¡±q ¸Ó °ð¦ì§}½d³òŪ¤J byte ªº¸ê®Æ§Y¥i. ¨Ï¥Î²Õ¦X»y¨¥¨Ó©µ¿ð®É¶¡ ¦pªG§Aª¾¹D°õ¦æµ{¦¡©Ò¦b¾÷¾¹ªº³B²z¾¹«¬§O»P®ÉÄÁ³t«×, §A¥i¥H°õ¦æ¬Y¨Ç²Õ¦X»y ¨¥«ü¥O¥H«KÀò±o¸ûµuªº©µ¿ð®É¶¡ (¦ý¬O°O¦í, §A¦b°õ¦æ¤¤ªº¦æµ{ (process) ÀH®É ·|³Q¼È°±, ©Ò¥H¦³®É©µ¿ðªº®É¶¡·|¤ñ¹ê»Úªø). ¦p¤U±ªºªí®æ©Ò¥Ü, ¤º³¡³B²z¾¹ªº ³t«×¨M©w¤F©Òn¨Ï¥Îªº®ÉÄÁ©P´Á¼Æ; ¦p, ¤@Ó 50 MHz ªº³B²z¾¹ (486DX-50 ©Î 486DX2-50), ¤@Ó®ÉÄÁ©P´Ánªá¶O 1/50000000 ¬í (=200 ©`¬í). «ü¥O i386 ®ÉÄÁ©P´Á¼Æ i486 ®ÉÄÁ©P´Á¼Æ nop 3 1 xchg %ax,%ax 3 3 or %ax,%ax 2 1 mov %ax,%ax 2 1 add %ax,0 2 1 (¹ï¤£°_, §Ú¤£ª¾¹D Pentiums ªº¸ê®Æ, ©Î³\»P i486 ±µªñ§a. §ÚµLªk¦b i386 ªº ¸ê®Æ¤W§ä¨ì¥uªá¶O¤@Ó®ÉÄÁ©P´Áªº«ü¥O. ¦pªG¯à°÷´N½Ð¨Ï¥Îªá¶O¤@Ó®ÉÄÁ©P´Áªº «ü¥O, n¤£µM´N¨Ï¥ÎºÞ½u§Þ³Nªº·s¦¡³B²z¾¹¤]¬O¥i¥HÁYµu®É¶¡ªº.) ¤W±ªºªí®æ¤¤«ü¥O nop »P xchg À³¸Ó¤£·|¦³¤£¨}ªº«áªG. «ü¥O³Ì«á¥i¯à·| §ïÅÜ ºX¸¹¼È¦s¾¹ªº¤º®e, ¦ý¬O³o¨SÃö«Y¦]¬° gcc ·|³B²z. «ü¥O nop ¬OÓ¦nªº¿ï¾Ü. ·Qn¦b§Aªºµ{¦¡¤¤¨Ï¥Î¨ì³o¨Ç«ü¥O, §A±o¨Ï¥Î asm("instruction"). «ü¥Oªº»yªk ´N¦p¦P¤W±ªí®æªº¥Îªk; ¦pªG§A·Qn¦b³æ¤@ªº asm() ±Ôz¤¤¨Ï¥Î¦hÓ«ü¥O, ¥i¥H ¨Ï¥Î¤À¸¹±N¥L̹j¶}. ¨Ò¦p, asm("nop ; nop ; nop ; nop") ·|°õ¦æ¥|Ó nop «ü¥O, ¦b i486 ©Î Pentium ³B²z¾¹¤¤·|©µ¿ð¥|Ó®ÉÄÁ©P´Á (©Î¬O i386 ·|©µ¿ð 12 Ó®ÉÄÁ©P´Á). gcc ·|±N asm() ½Ķ¦¨³æ¦æ²Õ¦X»y¨¥µ{¦¡½X, ©Ò¥H¤£·|¦³©I¥s¨ç¦¡ªºt²ü. ¦b Intel x86 ¬[ºc¤¤¤£¥i¯à¦³¤ñ¤@Ó®ÉÄÁ©P´ÁÁÙµuªº®É¶¡©µ¿ð. ¦b Pentiums ³B²z¾¹¤W¨Ï¥Î¨ç¦¡ rdtsc ¹ï©ó Pentiums ³B²z¾¹¦Ó¨¥, §A¥i¥H¨Ï¥Î¤U±ªº C »y¨¥µ{¦¡½X¨Ó¨ú±o¦Û±q¤W¦¸« ·s¶}¾÷ ¨ì²{¦b¸g¹L¤F¦h¤ÖÓ®ÉÄÁ©P´Á: ______________________________________________________________ extern __inline__ unsigned long long int rdtsc() { unsigned long long int x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; } ______________________________________________________________ §A¥i¥H¸ß°Ý°Ñ¦Ò¦¹È¥H«K©µ¿ð§A·Qnªº®ÉÄÁ©P´Á¼Æ. 4.2 ®É¶¡ªº¶q´ú ·Qn®É¶¡ºë½T¨ì¤@¬íÄÁ, ¨Ï¥Î¨ç¦¡ time() ©Î³\¬O³Ì²³æªº¤èªk. ·Qn®É¶¡§óºë ½T, ¨ç¦¡ gettimeofday() ¤j¬ù¥i¥Hºë½T¨ì·L¬í (¦ý¬O¦p«e©Òz·|¨ü¨ì CPU ±Æµ{ ªº¼vÅT). ¦Ü©ó Pentiums ³B²z¾¹, ¨Ï¥Î¤W±ªºµ{¦¡½X¤ùÂ_´N¥i¥Hºë½T¨ì¤@Ó®ÉÄÁ ©P´Á. ¦pªG§An§A°õ¦æ¤¤ªº¦æµ{ (process) ¦b¤@¬q®É¶¡¨ì¤F¤§«á¯à°÷³Q³qª¾ (get a signal), §A±o¨Ï¥Î¨ç¦¡ setitimer() ©Î alarm() . ²Ó¸`½Ð°Ñ¦Ò¨ç¦¡ªº¨Ï¥Î»¡©ú ¤å¥ó. 5. ¨Ï¥Î¨ä¥Lµ{¦¡»y¨¥ ¤W±ªº»¡©ú¶°¤¤¦b C µ{¦¡»y¨¥. ¥LÀ³¸Ó¥i¥Hª½±µÀ³¥Î¦b C++ ¤Î Objective C ¤§ ¤W. ¦Ü©ó²Õ¦X»y¨¥³¡¤À, ÁöµM§A¥²¶·¥ý¦b C »y¨¥¤¤©I¥s¨ç¦¡ ioperm() ©Î iopl() , ¦ý¬O¤§«á§A´N¥i¥Hª½±µ¨Ï¥Î I/O °ðŪ¼g«ü¥O. ¦Ü©ó¨ä¥Lµ{¦¡»y¨¥, °£«D§A¥i¥H¦b¸Óµ{¦¡»y¨¥¤¤´¡¤J³æ¦æ²Õ¦X»y¨¥©Î C »y¨¥¤§µ{ ¦¡½X©ÎªÌ¨Ï¥Î¤W±©Ò»¡ªº¨t²Î©I¥s, §_«hˤ£¦p¼¶¼g¤@Ó¤º§t¦³¦s¨ú I/O °ð©Î©µ ¿ð®É¶¡©Ò¥²»Ý¨ç¦¡¤§Â²³æªº C ì©lµ{¦¡½X©Î³\ÁÙ¤ñ¸û®e©ö, ½sĶ¤§«á¦A»P§Aªºµ{ ¦¡Ãìµ². n¤£µM´N¬O¨Ï¥Î«e±©Ò»¡ªº /dev/port ¦r¤¸¸Ë¸mÀÉ®×. 6. ¤@¨Ç¦³¥Îªº I/O °ð ¥»¸`´£¨Ñ¤@¨Ç±`¥Î I/O °ðªºµ{¦¡¼¶¼g¸ê°T³o¨Ç³£¬O¥i¥Hª½±µ®³¨Ó¥Îªº¤@¯ë¥Øªº TTL (©Î CMOS) ÅÞ¿è¦ì·Çªº I/O °ð. ¦pªG§An«ö·Ó¨äì©lªº³]p¥Øªº¨Ó¨Ï¥Î³o¨Ç©Î¨ä¥L±`¥ÎªºI/O °ð (¨Ò¦p, ±±¨î¤@ ¯ëªº¦Lªí¾÷©Î¼Æ¾Ú¾÷), §AÀ³¸Ó·|¨Ï¥Î²{¦¨ªº¸Ë¸mÅX°Êµ{¦¡ (¥L³q±`³Q§t¦b®Ö¤ß ¤¤) ¦Ó¤£·|¦p¥»¤å©Ò»¡¦a¥h¼¶¼g I/O °ðµ{¦¡. ¥»¸`¥Dn¬O´£¨Ñµ¹¨º¨Ç·Qn±N LCD Åã¥Ü¾¹, ¨B¶i°¨¹F, ©Î¬O¨ä¥L°Ó·~¹q¤l²£«~ ³s±µ¨ì PC ¼Ð·Ç I/O °ðªº¤H. ¦pªG§A·Qn±±¨î¤j²³¥«³õ©Ò³c½æªº¸Ë¸m¹³¬O±½´y¾¹ (¤w¸g¦b¥«³õ³c½æ¤F¤@¬q´Á ¶¡), ¥h§ä¬Ý¬Ý¬O§_¦³²{¦¨ªº Linux ¸Ë¸mÅX°Êµ{¦¡. ºô¶ [4]Hardware-HOWTO ¬O Ó¦nªº°Ñ¦Ò°_ÂI. ¦Ü©ó·Qnª¾¹D§ó¦h¦³Ãö¦p¦ó³s±µ¹q¤l¸Ë¸m¨ì¹q¸£(¥H¤Î¤@¯ëªº¹q¤l¾Çì²z)ªº¬ÛÃö ¸ê°T«hºô¶ [5]http://www.hut.fi/Misc/Electronics/ ¬OÓ¦nªº¸ê®Æ¨Ó·½. 6.1 ¨Ã¦C°ð (parallel port) ¨Ã¦C°ðªº°ò¥»°ð¦ì§} (¥H¤UºÙ¤§¬° ``BASE'') ¤§©ó /dev/lp0 ¬O 0x3bc , ¤§©ó /dev/lp1 ¬O 0x378 , ¤§©ó /dev/lp2 ¬O 0x278 . ¦pªG§A¥u¬O·Qn±±¨î¤@¨Ç¹³¬O ¤@¯ë¦Lªí¾÷ªº°Ê§@, ¥i¥H°Ñ¦Òºô¶ [6]Printing-HOWTO. °£¤F¤U±§Y±N´yzªº¼Ð·Ç¶È¿é¥X (output-only) ¼Ò¦¡, ¤j¦h¼Æªº¨Ã¦C°ð³£¦³ `ÂX ¥Rªº' Âù¦V (bidirectional) ¼Ò¦¡. ¦Ü©ó¸û·sªº ECP/EPP ¼Ò¦¡ (¥H¤Î¤@¯ëªº IEEE 1284 ¼Ð·Ç) °ð¤fªº¬ÛÃö¸ê®Æ, ¥i¥H°Ñ¦Òºô¶ [7]http://www.fapo.com/ ¥H ¤Î [8]http://www.senet.com.au/~cpeacock/parallel.htm. ¦]¬°¦b¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ¤¤ªºµ{¦¡µLªk¨Ï¥Î IRQs ©Î DMA, ·Qn¨Ï¥Î ECP/EPP ¼Ò¦¡§A©Î³\±o ¼¶¼g¤@Ӯ֤ߪº¸Ë¸mÅX°Êµ{¦¡; §Ú·QÀ³¸Ó¦³¤H¼g¤F³oÃþªº¸Ë¸mÅX°Êµ{¦¡, ¦ý¬O¸Ô ±¡§Ú¨Ã¤£ª¾¹D. °ð¦ì§} BASE+0 (¸ê®Æ°ð) ¥Î¨Ó±±¨î¸ê®Æ°ðªº«H¸¹¦ì·Ç (D0 ¨ì D7 ¤À§O¥NªíµÛ bits 0 ¨ì 7, ¦ì·Çª¬ºA: 0 = §C¦ì·Ç (0 V), 1 = °ª¦ì·Ç (5 V)). ¤@Ó¼g¤J¸ê ®Æ¨ì¸Ó°ðªº°Ê§@·|±N¸ê®Æ«H¸¹¦ì·Ç¬C¦í (latches) ¦b°ðªº¸}¦ì (pins) ¤W. ¤@Ó ±N¸Ó°ðªº¸ê®ÆŪ¥Xªº°Ê§@·|±N¤W¤@¦¸¥H¼Ð·Ç¶È¿é¥X (output-only) ¼Ò¦¡©ÎÂX¥Rªº ¼g¤J¼Ò¦¡©Ò¬C¦íªº¸ê®Æ«H¸¹¦ì·ÇŪ¦^, ©Î¬O¥HÂX¥RŪ¥X¼Ò¦¡ ±q¥t¥~¤@ Ӹ˸m±N ¸}¦ì¤Wªº¸ê®Æ«H¸¹¦ì·ÇŪ¦^. °ð¦ì§} BASE+1 (ª¬ºA°ð) ¬OÓ¶ÈŪ (read-only) ªº°ð, ·|±N¤U±ªº¿é¤J«H¸¹¦ì ·ÇŪ¦^: * Bits 0 ©M 1 «O¯d¤£¥Î. * Bit 2 IRQ ªºª¬ºA (¤£¬OÓ¸}¦ì (pin) , §Ú¤£ª¾¹D¥Lªº¤u§@ì²z) * Bit 3 ERROR (1=°ª¦ì·Ç) * Bit 4 SLCT (1=°ª¦ì·Ç) * Bit 5 PE (1=°ª¦ì·Ç) * Bit 6 ACK (1=°ª¦ì·Ç) * Bit 7 -BUSY (0=°ª¦ì·Ç) (§Ú¤£½T©w°ª§C¦ì·Çªº¹qÀ£ª¬ºA.) °ð¦ì§} BASE+2 (±±¨î°ð) ¬OӶȼg (write-only) ªº°ð (¤@Ó±N¸Ó°ðªº¸ê®ÆŪ¥X ªº°Ê§@¶È·|±N¤W¤@¦¸¼g¤Jªº¸ê®Æ«H¸¹¦ì·ÇŪ¦^), ¥Î¨Ó±±¨î¤U±ªºª¬ºA«H¸¹: * Bit 0 -STROBE (0=°ª¦ì·Ç) * Bit 1 AUTO_FD_XT (1=°ª¦ì·Ç) * Bit 2 -INIT (0=°ª¦ì·Ç) * Bit 3 SLCT_IN (1=°ª¦ì·Ç) * Bit 4 ·í³Q³]©w¬° 1 ®É¤¹³\¨Ã¦C°ð²£¥Í IRQ «H¸¹ (µo¥Í¦b ACK ¸}¦ìªº¦ì·Ç ¥Ñ§CÅÜ°ªªºÀþ¶¡) * Bit 5 ¥Î¨Ó±±¨îÂX¥R¼Ò¦¡®É°ðªº¿é¥X¤J¤è¦V (0 = ¼g, 1 = Ū), ³o¬OӶȼg (write-only) ªº°ð (¤@Ó±N¸Ó°ðªº¸ê®ÆŪ¥Xªº°Ê§@¹ï¦¹ bit ¤@ÂI¥Î³B¤]¨S ¦³). * Bits 6 and 7 «O¯d¤£¥Î. (¦P¼Ë¦a, §Ú¤£½T©w°ª§C¦ì·Çªº¹qÀ£ª¬ºA.) °ðªº¸}¦ì±Æ¦C (Pinout) ¤è¦¡ (¸Ó°ð¬O¤@Ó 25 °¦¸} D ¦r§Î¥~´ß (D-shell) ªº ¥ÀÀY³s±µ¾¹) (i=¿é¤J, o=¿é¥X): 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 ªº³W®æ¤å¥ó¤W»¡¸}¦ì 1, 14, 16, ©M 17 (±±¨î«H¸¹ªº¿é¥X) ±Ä¥Î¹q´¹Å骺¶} ¶°·¥ (open collector) ÅX°Ê¤è¦¡¥²»Ý¨Ï¥Î 4.7 ¥a¼Ú©i (kiloohm) ªº´£¤É¹qªý ±µ¦Ü 5 V ªº¹qÀ£ (¥i¬y¤J¹q¬y 20 mA, ¬y¥X¹q¬y 0.55 mA, °ª¦ì·Çªº¿é¥X¹qÀ£´N ¬O 5.0 V ´î¥h´£¤É¹qªýªº¹qÀ£). ³Ñ¤U¨Óªº¸}¦ì¥i¬y¤J¹q¬y 24 mA, ¬y¥X¹q¬y 15 mA, °ª¦ì·Çªº¿é¥X¹qÀ£³Ì¤p 2.4 V. §C¦ì·Çªº¿é¥X¹qÀ£¤GªÌ³£¬O³Ì¤j 0.5 V. ¨º¨Ç«D IBM ³W®æªº¨Ã¦C°ð©Î³\·|°¾Â÷³oӼзÇ. §ó¦hªº¬ÛÃö¸ê®Æ½Ð°Ñ¦Òºô¶ [9]http://www.hut.fi/Misc/Electronics/circuits/lptpower.html. ³Ì«á, µ¹§A¤@Óĵ§i: ¯d¤ß±µ¦aªº°ÝÃD. §Ú´¿¸g¦b¹q¸£ÁÙ¬O¶}¾÷ªºª¬ªp´N¥h³s±µ ¥L¦]¦Ó §ËÃa¦n´XӨæC°ð. µo¥Í¤F³oºØ¨Æ±¡§A¥i¯à·|ı±oÁÙ¬O¤£n±N¨Ã¦C°ð¾ã ¦X¨ì¥D¾÷ªO¸Ì±¤ñ¸û¦n. (§A³q±`¥i¥H®³¤@¤ù«K©yªº¼Ð·Ç `multi-I/O' ¥d¦w¸Ë²Ä ¤GÓ ¨Ã¦C°ð; ¥un±N¨ä¥L¤£»Ýnªº°ð°±¥Î, µM«á±N¥d¤ù¤W¨Ã¦C°ðªº°ð¦ì§}³]©w¦b ªÅµÛªº¦ì§}§Y¥i. §A¤£»Ý¦b·N¨Ã¦C°ðªº IRQ ³]©w, ¦]¬°³q±`¤£·|³Q¥Î¨ì.) 6.2 ¹CÀ¸ (¾ÞÁa±ì) °ð (game port) ¹CÀ¸°ðªº°ð¦ì§}½d³ò¬° 0x200-0x207. ·Qn±±¨î¤@¯ëªº¾ÞÁa±ì, ¦³¤@Ӯ֤߼h¦¸ ªº¾ÞÁa±ìÅX°Êµ{¦¡, ¥i°Ñ¦Òºô§} [10]ftp://sunsite.unc.edu/pub/Linux/kernel/patches/, ÀɦW joystick-*. °ðªº¸}¦ì±Æ¦C (Pinout) ¤è¦¡ (¸Ó°ð¬O¤@Ó 15 °¦¸} D ¦r§Î¥~´ß (D-shell) ªº ¥ÀÀY³s±µ¾¹): * 1,8,9,15: +5 V (¹q·½) * 4,5,12: ±µ¦a * 2,7,10,14: ¤À§O¬O BA1, BA2, BB1, ©M BB2 µ¥¼Æ¦ì¿é¤J * 3,6,11,13: ¤À§O¬O AX, AY, BX, ©M BY µ¥``Ãþ¤ñ''¿é¤J +5 V ªº¸}¦ì¦ü¥G³q±`·|³Qª½±µ³s±µ¨ì¥D¾÷ªOªº¹q·½½u¤W, ©Ò¥H¥LÀ³¸Ó¯à°÷´£¨Ñ¬Û ·íªº¹q¤O, ³oÁÙn¬Ý©Ò¨Ï¥Î¥D¾÷ªO, ¹q·½¨Ñµ¹¾¹, ¥H¤Î¹CÀ¸°ðªºÃþ«¬. ¼Æ¦ì¿é¤J¥Î©ó¾ÞÁa±ìªº«ö¶s¥i¥HÅý§A³s±µ¤GÓ¾ÞÁa±ìªº¥|Ó«ö¶s (¾ÞÁa±ì A ©M ¾ÞÁa±ì B, ¦U¦³¤GÓ«ö¶s) ¨ì¹CÀ¸°ð¤]´N¬O¼Æ¦ì¿é¤Jªº¥|Ó¸}¦ì. ¥LÌÀ³¸Ó¬O¤@ ¯ë TTL ¹qÀ£¦ì·Çªº¿é¤J, §A¥i¥Hª½±µ±qª¬ºA°ð (°Ñ¦Ò¤U±»¡©ú) Ū¥X¥L̪º¦ì·Ç ª¬ºA. ¤@Ó¹ê»Úªº¾ÞÁa±ì¦b«ö¶s³QÀ£¤U®É·|¶Ç¦^§C¦ì·Ç (0 V) ª¬ºA§_«h´N¬O°ª¦ì ·Ç (5V ¸g¥Ñ 1 Kohm ªº¹qªý³s±µ¨ì¹q·½¸}¦ì) ª¬ºA. ©Ò¿×ªºÃþ¤ñ¿é¤J¹ê»Ú¬O¶q´ú¨ìªºªý§ÜÈ. ¹CÀ¸°ð¦³¥|Ó³æÀ»¦h¿Ó®¶Àú¾¹ (one-shot multivibrator) (¤@Ó 558 ´¹¤ù) ³s±µ¨ì¥|ÓÃþ¤ñ¿é¤J¸}¦ì. ¨CÓÃþ ¤ñ¿é¤J¸}¦ì»P¦h¿Ó®¶Àú¾¹ªº¿é¥X¤§¶¡³s±µµÛ¤@Ó 2.2 Kohm ªº¹qªý, ¦Ó¥B¦h¿Ó®¶ Àú¾¹ªº¿é¥X»P¦a¤§¶¡³s±µµÛ¤@Ó 0.01 uF ªº®É§Ç¹q®e (timing capacitor). ¤@ Ó¹ê»Úªº¾ÞÁa±ì¨ä¨CÓ®y¼Ð (X ©M Y) ¤W·|¦³¤@Ó¥iÅܹqªý, ³s±µ¦b +5 V »P¨C Ӭ۹諸Ãþ¤ñ¿é¤J¸}¦ì¤§¶¡ (¸}¦ì AX ©Î AY ¬Oµ¹¾ÞÁa±ì A ¥Îªº, ¦Ó¸}¦ì BX ©Î BY ¬Oµ¹¾ÞÁa±ì B¥Îªº). ¾Þ§@ªº®ÉÔ, ¦h¿Ó®¶Àú¾¹±N¨ä¿é¥X³]©w¬°°ª¦ì·Ç (5 V) ¨Ã¥Bµ¥¨ì®É§Ç¹q®e¤Wªº¹q À£¹F¨ì 3.3 V ¤§«á±N¬Û¹ïªº¿é¥X³]©w¬°§C¦ì·Ç. ¦]¦¹¾ÞÁa±ì¤¤¦h¿Ó®¶Àú¾¹¿é¥Xªº °ª¦ì·Ç®É¶¡©P´Á »P¥iÅܹqªýªº¹qªýȦ¨¥¿¤ñ (¤]´N¬O, ¾ÞÁa±ì¦b¬Û¹ï®y¼Ðªº¦ì ¸m), ¦p¤U©Ò¥Ü: R = (t - 24.2) / 0.011, ¨ä¤¤ R ¬O¥iÅܹqªýªºªý§ÜÈ (ohms) ¦Ó t ¬O°ª¦ì·Ç®É¶¡©P´Áªºªø«× (¬í). ¦]¦¹nŪ¥XÃþ¤ñ¿é¤J¸}¦ìªº¼ÆÈ, º¥ý§A±o±Ò°Ê¦h¿Ó®¶Àú¾¹ (¥H°ð¼g¤Jªº¤è¦¡; ½Ð¬Ý¤U±), µM«á¬d¸ß¥|Ó®y¼Ðªº«H¸¹ª¬ºA(¥H«ùÄòªº°ðŪ¥X¤è¦¡)¤@ª½¨ì«H¸¹ª¬ºA ¥Ñ°ª¦ì·ÇÅܦ¨§C¦ì·Ç, pºâ¨ä°ª¦ì·Ç®É¶¡©P´Áªºªø«×. ³oÓ«ùÄò¬d¸ßªº°Ê§@ªá¶O ¬Û·í¦hªº CPU ®É¶¡, ¦Ó¥B¦b¤@Ó«D§Y®Éªº¦h¤uÀô¹Ò¹³¬O (¤@¯ëªº¨Ï¥ÎªÌ¼Ò¦¡ (user-mode) ) Linux, ©Ò±oªºµ²ªG¤£¬O«D±`·Ç½T¦]¬°§AµLªk¥H©T©wªº®É¶¡¨Ó¬d¸ß «H¸¹ªºª¬ºA (°£«D§A¨Ï¥Î®Ö¤ß¼h¦¸ªºÅX°Êµ{¦¡¦Ó¥B§A±o¦b§A¬d¸ßªº®ÉÔ§í¨î±¼¤¤ Â_ªº²£¥Í, ¦ý¬O³o¼Ë°µ·|®ö¶O§ó¦hªº CPU ®É¶¡). ¦pªG§Aª¾¹D«H¸¹ªºª¬ºA±N·|ªá ¶O¤@¬q¤£µuªº®É¶¡ (¼Æ¤Q²@¬í) Å×·|¦¨¬°§C¦ì·Ç, §A¥i¥H¦b¬d¸ß¤§«e©I¥s¨ç¦¡ usleep() ±N CPU ªº®É¶¡Åýµ¹¨ä¥L·Qn°õ¦æªº¦æµ{ (processes). ¹CÀ¸°ð¤¤°ß¤@»Ýn§A¨Ó¦s¨úªº°ð¦ì§}¬O 0x201 (¨ä¥Lªº°ð¦ì§}¤£¬O°Ê§@¤@¼Ë´N¬O ¨S¥Î). ¥ô¦ó¹ï³oÓ°ð¦ì§}©Ò°µªº¼g¤J°Ê§@ (¤£½×§A¼g¤J¤°»ò) ³£·|±Ò°Ê¦h¿Ó®¶Àú ¾¹. ¹ï³oÓ°ð¦ì§}°µÅª¥X°Ê§@·|¨ú¦^¿é¤J«H¸¹ªºª¬ºA: * Bit 0: AX ( (1=°ª¦ì·Ç) ¦h¿Ó®¶Àú¾¹ªº¿é¥Xª¬ºA) * Bit 1: AY ( (1=°ª¦ì·Ç) ¦h¿Ó®¶Àú¾¹ªº¿é¥Xª¬ºA) * Bit 2: BX ( (1=°ª¦ì·Ç) ¦h¿Ó®¶Àú¾¹ªº¿é¥Xª¬ºA) * Bit 3: BY ( (1=°ª¦ì·Ç) ¦h¿Ó®¶Àú¾¹ªº¿é¥Xª¬ºA) * Bit 4: BA1 (¼Æ¦ì¿é¤J, 1=°ª¦ì·Ç) * Bit 5: BA2 (¼Æ¦ì¿é¤J, 1=°ª¦ì·Ç) * Bit 6: BB1 (¼Æ¦ì¿é¤J, 1=°ª¦ì·Ç) * Bit 7: BB2 (¼Æ¦ì¿é¤J, 1=°ª¦ì·Ç) 6.3 ¦ê¦C°ð (serial port) ¦pªG§A©Ò»¡ªº¸Ë¸m¬O¤ä´©¤@¨Ç¹³¬O RS-232 ¨ºÃþªºªF¦è, §AÀ³¸Ó¥i¥H¦p§A©ÒÄ@¦a ¨Ï¥Î¦ê¦C°ð. Linux ©Ò´£¨Ñªº¦ê¦C°ðÅX°Êµ{¦¡À³¸Ó¯à°÷À³¥Î¦b¥ô¦ó¦a¤è (§AÀ³¸Ó ¤£»Ýnª½±µ¼¶¼g¦ê¦C°ðµ{¦¡, ©Î¬O®Ö¤ßªºÅX°Êµ{¦¡); ¥L¬Û·í¨ã¦³³q¥Î©Ê, ©Ò¥H¹³ ¬O¨Ï¥Î«D¼Ð·Çªº bps ³t²v¥H¤Î¨ä¥Lµ¥µ¥À³¸Ó¤£¬O°ÝÃD. ½Ð°Ñ¦Ò termios(3) »¡©ú ¤å¥ó, ¦ê¦C°ðÅX°Êµ{¦¡ì©lµ{¦¡½X (linux/drivers/char/serial.c), ¥H¤Îºô¶ [11]http://www.easysw.com/~mike/serial/index.html ¤W¦³§ó¦h¦b Unix §@·~ ¨t²Î¼¶¼g¦ê¦C°ðµ{¦¡ªº¬ÛÃö¸ê®Æ. 7. ´£¥Ü ¦pªG§A·Qn¦³¦nªº I/O «~È, §A¥i¥H¦b¨Ã¦C°ð¤W¦Û¦æ²Õ¸Ë ADC ¥B/©Î DAC ´¹¤ù (´£¥Ü: ¹q·½³¡¤À, ¥i¨Ï¥Î¹CÀ¸°ð¤Wªº©Î±N¥¼¥Î¨ìªººÏºÐ¹q·½³s±µÀY±µ¦Ü ¾÷´ß¤§ ¥~, ¦pªG§Aªº¸Ë¸m¥\²v®ø¯Ó§C«h¥i¥H®³¨Ã¦C°ð¨Ó¥R·í¹q·½, ¤£µM´N¬O¨Ï¥Î¥~³¡ªº ¹q·½¨Ñµ¹), ©Î¬O¶R AD/DA ¥d¤ù (¤j³¡¤À¸û«¬/¸û§C³tªº²£«~¥i¥Ñ I/O °ð±± ¨î). ©ÎªÌ¬O Linux µ®Ä¥dÅX°Êµ{¦¡©Ò¤ä´©ªº«K©yµ®Ä¥d (³t«×ÁÙ¬Û·íªº§Ö) ¤W 1 ©Î 2 Ó¤£ºë½T, (¥i¯à·|) µLªkÂk¹sªº«H¸¹³q¹D¹ï§A¦Ó¨¥´N°÷¤F. ¨Ï¥Îºë½TªºÃþ¤ñ¸Ë¸m, ¤£·íªº±µ¦a¥i¯à³y¦¨Ãþ¤ñ¿é¥X¤J«H¸¹ªº»~®t. ¦pªG§A¦³³o ¤è±ªº¸gÅç, §A¥i¯à·|¹Á¸Õ¥H¥ú½¢¦X¾¹¨Ó¹jµ´ (¹q¸£»P§Aªº¸Ë¸m¤§¶¡ ©Ò¦³ªº «H ¸¹) ¹q¤l¤zÂZ. ¸ÕµÛ±q¹q¸£¤W¨ú±o¥ú½¢¦X¾¹ªº¹q·½ (¦b°ð¤W¥¼¥Î¨ìªº«H¸¹¸}¦ì¥i ¥H´£¨Ñ¨¬°÷ªº¹q·½) ¥H¨D¹F¨ì³Ì¨Îªº¹jµ´®ÄªG. ¦pªG§A²{¦b¥¿¦b´M§ä¯à¦b Linux ¤W¨Ï¥Îªº¦L¨ê¹q¸ôªO³]p³nÅé, ¦³¤@ÓºÙ¬° Pcb §K¶Oªº X11 À³¥Îµ{¦¡À³¸Ó¯à°÷³Ó¥ô, ¥un§A¤£n°µ¤@¨Ç¤Ó½ÆÂøªº¨Æ. ³\¦hªº Linux µo¦æª©¥» (distributions) ³£¤º§t³oÓµ{¦¡, ¦P®É¥L¤]³Q©ñ¦bºô§} [12]ftp://sunsite.unc.edu/pub/Linux/apps/circuits/ ¤W(ÀɦW¬° pcb-*). 8. °ÝÃD±Æ°£ Q1. ·í§Ú¦s¨ú I/O °ð®Éµ²ªG¸I¨ì segmentation faults ³oÓ°ÝÃD A1. ¤£¬O§Aªºµ{¦¡¨S¦³ root Åv, ´N¬O¦]¬°¬Y¨Ç²z¥Ñ¾ÉP¨ç¦¡ ioperm() ©I ¥s¥¢±Ñ. Àˬd¨ç¦¡ ioperm() ªº¶Ç¦^È. ¦P®É, Àˬd§A©Ò¦s¨úªº°ð¤]´N¬O §A¥H ¨ç¦¡ ioperm() ©Ò±Ò¥Îªº°ð¦ì§} (°Ñ¦Ò Q3). ¦pªG§A¨Ï¥Îªº¬O©µ¿ð ®É¶¡ªº¥¨¶°«ü¥O (inb_p(), outb_p(), µ¥µ¥), °O±o¤]n©I¥s¨ç¦¡ ioperm() ¥H«K¦s¨ú°ð¦ì§} 0x80. Q2. §ÚµLªk§ä¨ì in*(), out*() µ¥¨ç¦¡³Q©w¸q¦b¦ó³B, ¦P®É gcc ¤]©ê«è°Ñ¦Ò ¨ì¥¼©w¸qªº²Å¸¹ (undefined references). A2. §A¦b½sĶµ{¦¡®É¨S¦³¥´¶}³Ì¨Î¤Æ¿ï¶µ (-O), ¦]¦¹ gcc ¤£¯à¸ÑªR asm/io.h ¤¤ªº¥¨¶°«ü¥O. ©Î¬O§A®Ú¥»´N¨S¦³¨Ï¥Î #include <asm/io.h>. Q3. out*() ¨S¦³°Ê§@, ©Î¬O°Ê§@©Ç©Çªº. A3. Àˬd°Ñ¼Æ©Ò©ñ¸mªº¦¸§Ç; ¥LÀ³¸Ó¬O³o¼Ë outb(value, port) , ¦Ó¤£¬O MS-DOS ¤W±`¥Îªº¨º¼Ë outportb(port, value) Q4. §Ú·Qn±±¨î¤@ӼзǪº RS-232 ¸Ë¸m/³s±µ¨Ã¦C°ðªº¦Lªí¾÷/¾ÞÁa±ì... A4. §A³Ì¦n¯à°±¤î¦¹¨Æ¦Ó¨Ï¥Î²{¦³ªºÅX°Êµ{¦¡ (¥L̦s¦b©ó Linux ªº®Ö¤ß¤¤ ©Î X ¦øªA¾¹¤¤©Î¨ä¥Lªº¦a¤è) ¨Ó¹F¦¨§Aªº¥Ø¼Ð. ³o¨ÇÅX°Êµ{¦¡³q±`¬Û·í ¨ã³q¥Î©Ê, ©Ò¥H´Nºâ¬O¦³ÂI¤£¼Ð·Çªº¸Ë¸m, ¥L̳q±`³£¯à¥¿±`¹B§@. ³o¨Ç ¼Ð·Ç I/O °ðªº¬ÛÃö¸ê°T½Ð°Ñ¦Ò«e±»¡¹Lªº¤å¥ó«ü¤Þ. 9. µ{¦¡½X½d¨Ò ³oÃä¬O¤@¬q¥Î¨Ó¦s¨ú I/O °ðªºÂ²³æªºµ{¦¡½X½d¨Ò: ______________________________________________________________ /* * example.c: ¤@ӥΨӦs¨ú I/O °ðªº«D±`²³æªº½d¨Ò * * ³oÓµ{¦¡½X¨Ã¨S¦³¤°»ò¥Î³B, ¥L¥u¬O°µ¤F°ðªº¼g¤J, ¼È°±, * ¥H¤Î°ðªºÅª¥X´XӰʧ@. ½sĶ®É½Ð¨Ï¥Î `gcc -O2 -o example example.c', * ¨Ã¥H root ªº¨¥÷°õ¦æ `./example'. */ #include <stdio.h> #include <unistd.h> #include <asm/io.h> #define BASEPORT 0x378 /* lp1 */ int main() { /* ¨ú±o°ð¦ì§}ªº¦s¨úÅv */ if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);} /* ³]©w°ðªº¿é¥X¸ê®Æ«H¸¹ (D0-7) ¥þ¬°¹s (0) */ outb(0, BASEPORT); /* ¥ð®§¤@¤U (100 ms) */ usleep(100000); /* ±qª¬ºA°ð (BASE+1) Ū¥X¸ê®Æ¨ÃÅã¥Üµ²ªG */ printf("status: %d\n", inb(BASEPORT + 1)); /* §Ṳ́£¦A»Ýn³o¨Ç°ð¦ì§} */ if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);} exit(0); } /* µ²§ô example.c */ ______________________________________________________________ 10. PÁ ¨ó§U¹L§Úªº¤H¹ê¦b¤Ó¦hµLªk¤@¤@¦C¥X, ¦ýÁÙ¬On¸ò¦U¦ì»¡Án¦hÁ¤F. ¹ï©Ò¦³¨Ó«H ¨ó§U§Úªº¤H¨Ã¨S¦³¤@¤@¦^ÂÐP¤W©êºp¤§·N, ¨Ã¦A¦¸ÁÂÁ§A̪º¨ó§U. References 1. http://sunsite.unc.edu/pub/Linux/docs/HOWTO/COPYRIGHT 2. http://www.redhat.com:8080/HyperNews/get/khg.html 3. http://luz.cs.nmt.edu/~rtlinux/ 4. http://sunsite.unc.edu/pub/Linux/docs/HOWTO/Hardware-HOWTO 5. http://www.hut.fi/Misc/Electronics/ 6. http://sunsite.unc.edu/pub/Linux/docs/HOWTO/Printing-HOWTO 7. http://www.fapo.com/ 8. http://www.senet.com.au/~cpeacock/parallel.htm 9. http://www.hut.fi/Misc/Electronics/circuits/lptpower.html 10. ftp://sunsite.unc.edu/pub/Linux/kernel/patches/ 11. http://www.easysw.com/~mike/serial/index.html 12. ftp://sunsite.unc.edu/pub/Linux/apps/circuits/