· 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
You are dishonest, but never to the point of hurting a friend.


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.0037 sec