¸®´ª½º I/O Æ÷Æ® ÇÁ·Î±×·¡¹Ö ¹Ì´Ï ÇÏ¿ìÅõÀúÀÚ: Riku Saikkonen < Riku.Saikkonen@hut.fi>ÃÖÁ¾ ¼öÁ¤ÀÏ: 1997³â 3¿ù 30ÀÏ ¹ø¿ª: À⵿̱ < kidong@opera.cse.cau.ac.kr>ÀÌ ¹®¼ÀÇ ÀúÀÛ±ÇÀº Riku Saikkonen¾¾¿¡°Ô ÀÖ´Ù. ÀÚ¼¼ÇÑ °ÍÀº ¸®´ª½º ÇÏ¿ìÅõ Àú ÀÛ±Ç Á¤º¸¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. ÀÌ ÇÏ¿ìÅõ ¹®¼´Â Çϵå¿þ¾î I/O Æ÷Æ® ÇÁ·Î±×·¡¹Ö°ú »ç¿ëÀÚ ¸ðµåÀÇ ÀÎÅÚ x86¿¡¼ µ¹¾Æ°¡´Â ¸®´ª½º ÇÁ·Î±×·¥¿¡¼ ªÀº ±â°£ÀÇ ½Ã°£À» ±â´Ù¸®´Â °ÍÀ» ¼³¸íÇÑ´Ù. ÀÌ ¹®¼´Â IO Æ÷Æ® ¹Ì´Ï ÇÏ¿ìÅõ¿¡¼ ³ª¿Â °ÍÀÌ´Ù. ¼öÁ¤Çϰųª ÷°¡ÇÒ »çÇ×ÀÌ ÀÖ´Ù¸é, ÁÖÀúÇÏÁö ¸»°í ÀüÀÚ¸ÞÀÏÀ» º¸³» Áֱ⠹ٶõ´Ù. ( Riku.Saikkonen@hut.fi)... ÀÌÀü ¹öÀü¿¡¼ÀÇ º¯µ¿ »çÇ× (1996³â 8¿ù 26ÀÏ) ÀúÀÚÀÇ ÀüÀÚ¿ìÆí ÁÖ¼Ò°¡ ¹Ù²î¾ú´Ù. ÇÊÀÚ°¡ »ý°¢ÇÑ ´ë·Î ioperm() ±ÇÇÑÀº fork()¸¦ ÅëÇؼ Àü´ÞµÇÁö ¾Ê´Â´Ù. ¸¹Àº ÁÖÁ¦¿¡ ´ëÇÑ Á¤º¸¸¦ ´Ù·é À¥ÆäÀÌÁö(URL)µéÀÌ Ãß°¡µÊ ±× ¿Ü¿¡ ´Ù¸¥ ÀÛÀº º¯È 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>)¸¦ Àо¶ó. ¶ÇÇÑ »ç¿ëÀÚ-¸ðµå ÇÁ·Î±×·¥¿¡¼´Â ÀÎÅÍ·´Æ®¸¦ ±ÝÁö½Ãų ¼ö ¾ø´Ù. 4. °íÇØ»óµµ Å¸À̹Ö: Áö¿¬ ½Ã°£¿ì¼±, ¸®´ª½ºÀÇ ¼±Á¡Çü ¸ÖƼŽºÅ· ¶§¹®¿¡ »ç¿ëÀÚ ¸ðµåÀÇ ÇÁ·Î¼¼½º°¡ ŸÀ̹ÖÀ» Á¤È®È÷ Á¦¾îÇÏ´ÂÁö º¸ÁõÇÒ ¼ö ¾ø´Ù´Â °Í¿¡ ÁÖÀÇÇÑ´Ù. ¹«¾ùº¸´Ùµµ, »ç¿ëÀÚ ¸ðµåÀÇ ÇÁ·Î¼¼½º´Â ¸ÖƼ ŽºÅ·°ú ¸®´ª½ºÀÇ ¼±Á¡ÀûÀΠƯ¼º ¶§¹®¿¡ Á¤È®ÇÑ Å¸À̹ÖÀ» º¸ Àå¹ÞÀ» ¼ö ¾ø´Ù´Â °ÍÀ» ¸»ÇÏ°í ½Í´Ù. ¿©·¯ºÐÀÇ ÇÁ·Î¼¼½º°¡ 10¹Ð¸® ÃÊ¿¡¼ (·Îµå °¡ Å©°Ô °É¸®´Â ½Ã½ºÅÛ¿¡¼) ¼ö Ãʵ¿¾È ½ºÄÉÁ층¿¡¼ Á¦¿ÜµÉ ¼ö ÀÖ´Ù. ±×·¯³ª, I/O Æ÷Æ®¸¦ »ç¿ëÇÏ´Â ´ëºÎºÐÀÇ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ ÀÌ´Â º°·Î ¹®Á¦°¡ µÇÁö ¾Ê´Â ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÃÖ¼ÒÈ ÇÏ·Á¸é ¿©·¯ºÐÀÇ ÇÁ·Î¼¼½º¸¦ nice ¸í·É¾î·Î ³ôÀº ¿ì¼± ¼øÀ§¸¦ ºÎ¿©ÇÒ ¼ö ÀÖ´Ù. (nice(2)ÀÇ ¸Å´º¾ó ÆäÀÌÁö¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù). ÀÏ¹Ý »ç¿ëÀÚ ¸ðµåÀÇ ÇÁ·Î¼¼½º¸¦ Á¤È®ÇÑ Å¸À̹ÖÀ¸·Î ¼öÇà½ÃÅ°·Á ÇÑ´Ù¸é, »ç¿ëÀÚ ¸ðµåÀÇ `¸®¾ó ŸÀÓ' ±â´ÉÀÌ Áö¿øµÇ¾î¾ß ÇÑ´Ù. ¸®´ª½º 2.x Ä¿³Î¿¡¼´Â ¼ÒÇÁÆ® ¸® ¾ó ŸÀÓ ±â´ÉÀÌ Áö¿øµÇ¾î¾ß ÇÑ´Ù; ÀÚ¼¼ÇÑ °ÍÀº sched_setscheduler(2) ¸ÇÆäÀÌÁö ¸¦ ÂüÁ¶ÇÑ´Ù. ÇÏµå ¸®¾ó ŸÀÓÀ» Áö¿øÇϴ Ưº°ÇÑ Ä¿³ÎÀÌ ÀÖ´Ù. ÀÌ¿¡ ´ëÇÑ ´õ ¸¹ Àº Á¤º¸´Â <URL: 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/> ¿Í < 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>. ¸¶Áö¸·À¸·Î, °æ°í: Á¢Áö ÇÒ ¶§ ÁÖÀÇÇϵµ·Ï ÇÑ´Ù. ÇÊÀÚ´Â ÄÄÇ»ÅÍ°¡ ÄÑ ÀÖÀ» ¶§ ¿¬ °áÀ» Çؼ º´·Ä Æ÷Æ® ¸î °³¸¦ ¸Á°¡¶ß·È´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡´Â º¸µå¿¡ ÅëÇյǾî ÀÖ Áö ¾ÊÀº º´·Ä Æ÷Æ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀ¸·Î º¸ÀδÙ. (¿©·¯ºÐÀº µÎ¹ø° Àú·Å ÇÑ Ç¥ÁØ `¸ÖƼ-IO'Ä«µå¿¡¼ º´·Ä Æ÷Æ®¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù; ÇÊ¿ä ¾ø´Â Æ÷Æ®´Â »ç¿ë À» ±ÝÁöÇÑ´Ù, ±×¸®°í Ä«µåÀÇ º´·Ä Æ÷Æ® ÁÖ¼Ò¸¦ ºñ¾î ÀÖ´Â ÁÖ¼Ò·Î Àâ´Â´Ù. º´·Ä Æ÷Æ®ÀÇ IRQ¿¡ ´ëÇؼ °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù, »ç½Ç °ÅÀÇ ¾²ÀÌÁö ¾Ê±â ¶§¹®ÀÌ´Ù. °ÔÀÓ (Á¶À̽ºÆ½) Æ÷Æ® (0x200-0x207 Æ÷Æ®): (ÀÏ¹Ý Á¶À̽ºÆ½À» Á¦¾îÇϹǷÎ, Ä¿³Î- ¼öÁØÀÇ Á¶À̽ºÆ½ µå¶óÀ̹ö°¡ ÀÖ´Ù. 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>¸¦ ÂüÁ¶ÇÑ´Ù. ¿©·¯ºÐÀÌ ÁÁÀº ¾Æ³¯·Î±× I/O¸¦ ¿øÇÑ´Ù¸é, ¿©·¯ºÐÀº ADC¿Í DACĨÀ» º´·Ä Æ÷Æ® ¿¡ ¿¬°áÇÒ ¼ö ÀÖ´Ù. (ÈùÆ®: ÆÄ¿ö¸¦ À§Çؼ´Â °ÔÀÓ Æ÷Æ® Ä¿³ØÅÍ ¶Ç´Â ÄÄÇ»ÅÍ ÄÉÀÌ ½ºÀÇ ¹Ù±ù¿¡ ¿¬°áÇÏ´Â ¿¹ºñ µð½ºÅ© µå¶óÀ̺êÀÇ ÆÄ¿ö Ä¿³ØÅ͸¦ »ç¿ëÇÑ´Ù, ¿©·¯ºÐ ÀÌ ³·Àº Àü·Â ÀåÄ¡¸¦ »ç¿ëÇϰųª ÆÄ¿ö ¶§¹®¿¡ º´·Ä Æ÷Æ® ÀÚü¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó¸é) ¶Ç´Â, AD/DA Ä«µå¸¦ ±¸ÀÔÇÑ´Ù(´õ ´À¸° Ä«µåµé ´ëºÎºÐÀº I/O Æ÷ Æ®°¡ Á¦¾îÇÑ´Ù). ºÎÁ¤È®ÇÏ°í ¿µÁ¡ ºÒ¾ÈÁ¤ÇÔ¿¡µµ ÇÑ °³³ª µÎ °³ÀÇ Ã¤³Î¿¡ ¸¸Á·ÇÑ ´Ù¸é, ¸®´ª½º »ç¿îµå µå¶óÀ̹ö¿¡¼ Áö¿øµÇ´Â Àú°¡ÀÇ »ç¿îµå Ä«µåµµ ÇÒ ¼ö ÀÖ´Ù. (ÀÌ´Â ÃæºÐÈ÷ ºü¸£´Ù.) ´Ù¸¥ ÈùÆ®: ¿©·¯ºÐÀÌ ¸®´ª½º¿ë ÇÁ¸°Æ®µÈ ȸ·Î º¸µå µðÀÚÀÎ ¼ÒÇÁÆ®¿þ¾î¸¦ ã°í ÀÖ´Ù¸é, Pcb¶ó ºÒ¸®´Â °ø°³ÀÇ X11 ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Àִµ¥, Àß µ¿ÀÛÇÒ °ÍÀÌ´Ù. ÃÖ¾ÇÀÇ °æ¿ì ¿©·¯ºÐÀÌ º¹ÀâÇؼ ¾Æ¹«°Íµµ ÇÒ ¼ö ¾øÀ» ¼öµµ ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¸¹Àº ¸®´ª½º ¹èÆ÷º»¿¡ Æ÷ÇԵǾî ÀÖ°í, 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 Æ÷Æ® ÇÁ·Î±×·¡¹Ö ¹Ì´Ï ÇÏ¿ìÅõ ³¡ ¸®´ª½º I/O Æ÷Æ® ÇÁ·Î±×·¡¹Ö ¹Ì´Ï ÇÏ¿ìÅõÀúÀÚ: Riku Saikkonen < Riku.Saikkonen@hut.fi>ÃÖÁ¾ ¼öÁ¤ÀÏ: 1997³â 3¿ù 30ÀÏ ¹ø¿ª: À⵿̱ < kidong@opera.cse.cau.ac.kr>ÀÌ ¹®¼ÀÇ ÀúÀÛ±ÇÀº Riku Saikkonen¾¾¿¡°Ô ÀÖ´Ù. ÀÚ¼¼ÇÑ °ÍÀº ¸®´ª½º ÇÏ¿ìÅõ Àú ÀÛ±Ç Á¤º¸¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. ÀÌ ÇÏ¿ìÅõ ¹®¼´Â Çϵå¿þ¾î I/O Æ÷Æ® ÇÁ·Î±×·¡¹Ö°ú »ç¿ëÀÚ ¸ðµåÀÇ ÀÎÅÚ x86¿¡¼ µ¹¾Æ°¡´Â ¸®´ª½º ÇÁ·Î±×·¥¿¡¼ ªÀº ±â°£ÀÇ ½Ã°£À» ±â´Ù¸®´Â °ÍÀ» ¼³¸íÇÑ´Ù. ÀÌ ¹®¼´Â IO Æ÷Æ® ¹Ì´Ï ÇÏ¿ìÅõ¿¡¼ ³ª¿Â °ÍÀÌ´Ù. ¼öÁ¤Çϰųª ÷°¡ÇÒ »çÇ×ÀÌ ÀÖ´Ù¸é, ÁÖÀúÇÏÁö ¸»°í ÀüÀÚ¸ÞÀÏÀ» º¸³» Áֱ⠹ٶõ´Ù. ( Riku.Saikkonen@hut.fi)... ÀÌÀü ¹öÀü¿¡¼ÀÇ º¯µ¿ »çÇ× (1996³â 8¿ù 26ÀÏ) ÀúÀÚÀÇ ÀüÀÚ¿ìÆí ÁÖ¼Ò°¡ ¹Ù²î¾ú´Ù. ÇÊÀÚ°¡ »ý°¢ÇÑ ´ë·Î ioperm() ±ÇÇÑÀº fork()¸¦ ÅëÇؼ Àü´ÞµÇÁö ¾Ê´Â´Ù. ¸¹Àº ÁÖÁ¦¿¡ ´ëÇÑ Á¤º¸¸¦ ´Ù·é À¥ÆäÀÌÁö(URL)µéÀÌ Ãß°¡µÊ ±× ¿Ü¿¡ ´Ù¸¥ ÀÛÀº º¯È 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>)¸¦ Àо¶ó. ¶ÇÇÑ »ç¿ëÀÚ-¸ðµå ÇÁ·Î±×·¥¿¡¼´Â ÀÎÅÍ·´Æ®¸¦ ±ÝÁö½Ãų ¼ö ¾ø´Ù. 4. °íÇØ»óµµ Å¸À̹Ö: Áö¿¬ ½Ã°£¿ì¼±, ¸®´ª½ºÀÇ ¼±Á¡Çü ¸ÖƼŽºÅ· ¶§¹®¿¡ »ç¿ëÀÚ ¸ðµåÀÇ ÇÁ·Î¼¼½º°¡ ŸÀ̹ÖÀ» Á¤È®È÷ Á¦¾îÇÏ´ÂÁö º¸ÁõÇÒ ¼ö ¾ø´Ù´Â °Í¿¡ ÁÖÀÇÇÑ´Ù. ¹«¾ùº¸´Ùµµ, »ç¿ëÀÚ ¸ðµåÀÇ ÇÁ·Î¼¼½º´Â ¸ÖƼ ŽºÅ·°ú ¸®´ª½ºÀÇ ¼±Á¡ÀûÀΠƯ¼º ¶§¹®¿¡ Á¤È®ÇÑ Å¸À̹ÖÀ» º¸ Àå¹ÞÀ» ¼ö ¾ø´Ù´Â °ÍÀ» ¸»ÇÏ°í ½Í´Ù. ¿©·¯ºÐÀÇ ÇÁ·Î¼¼½º°¡ 10¹Ð¸® ÃÊ¿¡¼ (·Îµå °¡ Å©°Ô °É¸®´Â ½Ã½ºÅÛ¿¡¼) ¼ö Ãʵ¿¾È ½ºÄÉÁ층¿¡¼ Á¦¿ÜµÉ ¼ö ÀÖ´Ù. ±×·¯³ª, I/O Æ÷Æ®¸¦ »ç¿ëÇÏ´Â ´ëºÎºÐÀÇ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ ÀÌ´Â º°·Î ¹®Á¦°¡ µÇÁö ¾Ê´Â ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÃÖ¼ÒÈ ÇÏ·Á¸é ¿©·¯ºÐÀÇ ÇÁ·Î¼¼½º¸¦ nice ¸í·É¾î·Î ³ôÀº ¿ì¼± ¼øÀ§¸¦ ºÎ¿©ÇÒ ¼ö ÀÖ´Ù. (nice(2)ÀÇ ¸Å´º¾ó ÆäÀÌÁö¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù). ÀÏ¹Ý »ç¿ëÀÚ ¸ðµåÀÇ ÇÁ·Î¼¼½º¸¦ Á¤È®ÇÑ Å¸À̹ÖÀ¸·Î ¼öÇà½ÃÅ°·Á ÇÑ´Ù¸é, »ç¿ëÀÚ ¸ðµåÀÇ `¸®¾ó ŸÀÓ' ±â´ÉÀÌ Áö¿øµÇ¾î¾ß ÇÑ´Ù. ¸®´ª½º 2.x Ä¿³Î¿¡¼´Â ¼ÒÇÁÆ® ¸® ¾ó ŸÀÓ ±â´ÉÀÌ Áö¿øµÇ¾î¾ß ÇÑ´Ù; ÀÚ¼¼ÇÑ °ÍÀº sched_setscheduler(2) ¸ÇÆäÀÌÁö ¸¦ ÂüÁ¶ÇÑ´Ù. ÇÏµå ¸®¾ó ŸÀÓÀ» Áö¿øÇϴ Ưº°ÇÑ Ä¿³ÎÀÌ ÀÖ´Ù. ÀÌ¿¡ ´ëÇÑ ´õ ¸¹ Àº Á¤º¸´Â <URL: 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/> ¿Í < 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>. ¸¶Áö¸·À¸·Î, °æ°í: Á¢Áö ÇÒ ¶§ ÁÖÀÇÇϵµ·Ï ÇÑ´Ù. ÇÊÀÚ´Â ÄÄÇ»ÅÍ°¡ ÄÑ ÀÖÀ» ¶§ ¿¬ °áÀ» Çؼ º´·Ä Æ÷Æ® ¸î °³¸¦ ¸Á°¡¶ß·È´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡´Â º¸µå¿¡ ÅëÇյǾî ÀÖ Áö ¾ÊÀº º´·Ä Æ÷Æ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀ¸·Î º¸ÀδÙ. (¿©·¯ºÐÀº µÎ¹ø° Àú·Å ÇÑ Ç¥ÁØ `¸ÖƼ-IO'Ä«µå¿¡¼ º´·Ä Æ÷Æ®¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù; ÇÊ¿ä ¾ø´Â Æ÷Æ®´Â »ç¿ë À» ±ÝÁöÇÑ´Ù, ±×¸®°í Ä«µåÀÇ º´·Ä Æ÷Æ® ÁÖ¼Ò¸¦ ºñ¾î ÀÖ´Â ÁÖ¼Ò·Î Àâ´Â´Ù. º´·Ä Æ÷Æ®ÀÇ IRQ¿¡ ´ëÇؼ °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù, »ç½Ç °ÅÀÇ ¾²ÀÌÁö ¾Ê±â ¶§¹®ÀÌ´Ù. °ÔÀÓ (Á¶À̽ºÆ½) Æ÷Æ® (0x200-0x207 Æ÷Æ®): (ÀÏ¹Ý Á¶À̽ºÆ½À» Á¦¾îÇϹǷÎ, Ä¿³Î- ¼öÁØÀÇ Á¶À̽ºÆ½ µå¶óÀ̹ö°¡ ÀÖ´Ù. 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>¸¦ ÂüÁ¶ÇÑ´Ù. ¿©·¯ºÐÀÌ ÁÁÀº ¾Æ³¯·Î±× I/O¸¦ ¿øÇÑ´Ù¸é, ¿©·¯ºÐÀº ADC¿Í DACĨÀ» º´·Ä Æ÷Æ® ¿¡ ¿¬°áÇÒ ¼ö ÀÖ´Ù. (ÈùÆ®: ÆÄ¿ö¸¦ À§Çؼ´Â °ÔÀÓ Æ÷Æ® Ä¿³ØÅÍ ¶Ç´Â ÄÄÇ»ÅÍ ÄÉÀÌ ½ºÀÇ ¹Ù±ù¿¡ ¿¬°áÇÏ´Â ¿¹ºñ µð½ºÅ© µå¶óÀ̺êÀÇ ÆÄ¿ö Ä¿³ØÅ͸¦ »ç¿ëÇÑ´Ù, ¿©·¯ºÐ ÀÌ ³·Àº Àü·Â ÀåÄ¡¸¦ »ç¿ëÇϰųª ÆÄ¿ö ¶§¹®¿¡ º´·Ä Æ÷Æ® ÀÚü¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó¸é) ¶Ç´Â, AD/DA Ä«µå¸¦ ±¸ÀÔÇÑ´Ù(´õ ´À¸° Ä«µåµé ´ëºÎºÐÀº I/O Æ÷ Æ®°¡ Á¦¾îÇÑ´Ù). ºÎÁ¤È®ÇÏ°í ¿µÁ¡ ºÒ¾ÈÁ¤ÇÔ¿¡µµ ÇÑ °³³ª µÎ °³ÀÇ Ã¤³Î¿¡ ¸¸Á·ÇÑ ´Ù¸é, ¸®´ª½º »ç¿îµå µå¶óÀ̹ö¿¡¼ Áö¿øµÇ´Â Àú°¡ÀÇ »ç¿îµå Ä«µåµµ ÇÒ ¼ö ÀÖ´Ù. (ÀÌ´Â ÃæºÐÈ÷ ºü¸£´Ù.) ´Ù¸¥ ÈùÆ®: ¿©·¯ºÐÀÌ ¸®´ª½º¿ë ÇÁ¸°Æ®µÈ ȸ·Î º¸µå µðÀÚÀÎ ¼ÒÇÁÆ®¿þ¾î¸¦ ã°í ÀÖ´Ù¸é, Pcb¶ó ºÒ¸®´Â °ø°³ÀÇ X11 ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Àִµ¥, Àß µ¿ÀÛÇÒ °ÍÀÌ´Ù. ÃÖ¾ÇÀÇ °æ¿ì ¿©·¯ºÐÀÌ º¹ÀâÇؼ ¾Æ¹«°Íµµ ÇÒ ¼ö ¾øÀ» ¼öµµ ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¸¹Àº ¸®´ª½º ¹èÆ÷º»¿¡ Æ÷ÇԵǾî ÀÖ°í, 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 Æ÷Æ® ÇÁ·Î±×·¡¹Ö ¹Ì´Ï ÇÏ¿ìÅõ ³¡ |
You are dishonest, but never to the point of hurting a friend. |