· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linuxdoc Sgml/IO-Port-Programming

¸®´ª½º 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 Æ÷Æ® ÇÁ·Î±×·¡¹Ö ¹Ì´Ï ÇÏ¿ìÅõ ³¡

¸®´ª½º 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 Æ÷Æ® ÇÁ·Î±×·¡¹Ö ¹Ì´Ï ÇÏ¿ìÅõ ³¡


ID
Password
Join
Promptness is its own reward, if one lives by the clock instead of the sword.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-07-14 19:10:45
Processing time 0.0029 sec