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

<!doctype linuxdoc system>
 <article>
<title>
        ¸®´ª½º I/O Æ÷Æ® ÇÁ·Î±×·¡¹Ö ¹Ì´Ï ÇÏ¿ìÅõ

<author>ÀúÀÚ: Riku Saikkonen <<url url=" mailto:Riku.Saikkonen@hut.fi" name="Riku.Saikkonen@hut.fi" >>
<date> ÃÖÁ¾ ¼öÁ¤ÀÏ: 1997³â 3¿ù 30ÀÏ
<trans>¹ø¿ª: À⵿̱ <<url url="mailto:kidong@opera.cse.cau.ac.kr" name="kidong@opera.cse.cau.ac.kr">>
<abstract>
ÀÌ ¹®¼­ÀÇ ÀúÀÛ±ÇÀº Riku Saikkonen¾¾¿¡°Ô ÀÖ´Ù. ÀÚ¼¼ÇÑ °ÍÀº ¸®´ª½º ÇÏ¿ìÅõ Àú
ÀÛ±Ç Á¤º¸¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.
ÀÌ ÇÏ¿ìÅõ ¹®¼­´Â Çϵå¿þ¾î I/O Æ÷Æ® ÇÁ·Î±×·¡¹Ö°ú »ç¿ëÀÚ ¸ðµåÀÇ ÀÎÅÚ x86¿¡¼­ 
µ¹¾Æ°¡´Â ¸®´ª½º ÇÁ·Î±×·¥¿¡¼­ ªÀº ±â°£ÀÇ ½Ã°£À»  ±â´Ù¸®´Â °ÍÀ» ¼³¸íÇÑ´Ù. ÀÌ 
¹®¼­´Â IO Æ÷Æ® ¹Ì´Ï ÇÏ¿ìÅõ¿¡¼­ ³ª¿Â °ÍÀÌ´Ù.
¼öÁ¤Çϰųª ÷°¡ÇÒ »çÇ×ÀÌ ÀÖ´Ù¸é, ÁÖÀúÇÏÁö ¸»°í ÀüÀÚ¸ÞÀÏÀ» º¸³» Áֱ⠹ٶõ´Ù.
(<url url="mailto:Riku.Saikkonen@hut.fi" name="Riku.Saikkonen@hut.fi" >)...
ÀÌÀü ¹öÀü¿¡¼­ÀÇ º¯µ¿ »çÇ× (1996³â 8¿ù 26ÀÏ)
ÀúÀÚÀÇ ÀüÀÚ¿ìÆí ÁÖ¼Ò°¡ ¹Ù²î¾ú´Ù.
ÇÊÀÚ°¡ »ý°¢ÇÑ ´ë·Î ioperm() ±ÇÇÑÀº fork()¸¦ ÅëÇØ¼­ Àü´ÞµÇÁö ¾Ê´Â´Ù.
¸¹Àº ÁÖÁ¦¿¡ ´ëÇÑ Á¤º¸¸¦ ´Ù·é À¥ÆäÀÌÁö(URL)µéÀÌ Ãß°¡µÊ
±× ¿Ü¿¡ ´Ù¸¥ ÀÛÀº º¯È­
</abstract>
<toc>
        <sect>C ÇÁ·Î±×·¥¿¡¼­ I/O Æ÷Æ®, ÀϹÝÀûÀÎ ¹æ¹ý<p>
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()¿Í À§ÀÇ ¸ÅÅ©·Î¿¡ ´ë
ÇÑ ¸Å´º¾ó ÆäÀÌÁö°¡ ÀÖ´Ù.
</p>

<sect>        I/O Æ÷Æ®¸¦ ÀÐ°í ¾²´Â ¶Ç´Ù¸¥ ¹æ¹ý<p>
I/O Æ÷Æ®¸¦ ÀÐ°í ¾²´Â ¶Ç´Ù¸¥ ¹æ¹ýÀº open() /dev/port (¹®ÀÚ ÀåÄ¡, ÁÖ¹øÈ£ 1, ºÎ
¹øÈ£ 4) ÀÐ°í ¾²±â À§Çؼ­ (stdio.hÀÇ f*(),  Áï Ç¥ÁØ ÀÔÃâ·Â ÆÄÀÏ Ã³¸® ÇÔ¼ö´Â ³»
ºÎÀûÀÎ ¹öÆÛ¸µÀ» °¡Áö°í À־,  À̵éÀ» ÇÇÇÑ´Ù??). ±× ´ÙÀ½ lseek()´Â ÆÄÀÏ¿¡¼­ 
ÀûÀýÇÑ ÁöÁ¡¿¡ À§Ä¡½Ã۴µ¥ ¾²À̰í(ÆÄÀÏ À§Ä¡ 0 = Æ÷Æ®  0, ÆÄÀÏ À§Ä¡ 1 = Æ÷Æ® 
1, µîµî), ¿©±â¼­ ¿Â ¹ÙÀÌÆ®³ª ¿öµå¸¦ ÀÐ°í ¾²±â À§ÇÏ¿© read() ¶Ç´Â write()¸¦ »ç
¿ëÇÑ´Ù.

¹°·Ð, ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥Àº /dev/port¸¦ ÀÐ°í ¾µ Çʿ䰡 ÀÖ´Ù. ÀÌ ¹æ¹ýÀº º¸Åë ¾²
ÀÌ´Â ¹æ¹ýº¸´Ù´Â Á¶±Ý  ´À¸®Áö¸¸, ÃÖÀûÈ­³ª ioperm()¸¦ ÇÊ¿ä·Î ÇÏÁö  ¾Ê´Â´Ù. (¿©
·¯ºÐÀÌ /dev/port¿¡ ÀÏ¹Ý »ç¿ëÀÚ  ±ÇÇÑÀ̳ª ±×·ì ±ÇÇÑÀ» ÁÖ¾úÀ» ¶§´Â, ·çÆ®·Î ½Ç
ÇàÇÒ Çʿ䰡 ¾ø´Ù.)
</p>

<sect>        ÀÎÅÍ·´Æ®(IRQs)¿Í DMA ¿¢¼¼½º<p>
¿©·¯ºÐÀº »ç¿ëÀÚ-¸ðµå ÇÁ·Î±×·¥¿¡¼­ Á÷Á¢  IRQ³ª DMA¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ¿©·¯
ºÐÀº Ä¿³Î µå¶óÀ̹ö¸¦ ÀÛ¼ºÇÒ Çʿ䰡  ÀÖ´Ù¸é ÀÚ¼¼ÇÑ »çÇ×°ú Ä¿³Î ¼Ò½º ÄÚµå ¿¹
Á¦´Â     
<verb>
      Linux            Kernel           Hacker's            Guide 
</verb>
(<<url url="http://www.redhat.com:8080/HyperNews/get/khg.html" name="www.redhat.com:8080/HyperNews/get/khg.html" >>)¸¦ Àо¶ó.
¶ÇÇÑ »ç¿ëÀÚ-¸ðµå ÇÁ·Î±×·¥¿¡¼­´Â ÀÎÅÍ·´Æ®¸¦ ±ÝÁö½Ãų ¼ö ¾ø´Ù.
</p>

<sect>        °íÇØ»óµµ ŸÀ̹Ö: Áö¿¬ ½Ã°£<p>
¿ì¼±, ¸®´ª½ºÀÇ ¼±Á¡Çü  ¸ÖƼŽºÅ· ¶§¹®¿¡ »ç¿ëÀÚ ¸ðµåÀÇ  ÇÁ·Î¼¼½º°¡ ŸÀ̹ÖÀ» 
Á¤È®È÷ Á¦¾îÇÏ´ÂÁö º¸ÁõÇÒ ¼ö ¾ø´Ù´Â °Í¿¡ ÁÖÀÇÇÑ´Ù. ¹«¾ùº¸´Ùµµ, »ç¿ëÀÚ ¸ðµåÀÇ 
ÇÁ·Î¼¼½º´Â ¸ÖƼ ŽºÅ·°ú ¸®´ª½ºÀÇ  ¼±Á¡ÀûÀΠƯ¼º ¶§¹®¿¡ Á¤È®ÇÑ Å¸À̹ÖÀ» º¸
Àå¹ÞÀ» ¼ö ¾ø´Ù´Â °ÍÀ» ¸»Ç졒  ½Í´Ù. ¿©·¯ºÐÀÇ ÇÁ·Î¼¼½º°¡ 10¹Ð¸® ÃÊ¿¡¼­ (·Îµå
°¡ Å©°Ô  °É¸®´Â ½Ã½ºÅÛ¿¡¼­) ¼ö Ãʵ¿¾È  ½ºÄÉÁ층¿¡¼­ Á¦¿ÜµÉ ¼ö ÀÖ´Ù.  ±×·¯³ª, 
I/O Æ÷Æ®¸¦ »ç¿ëÇÏ´Â ´ëºÎºÐÀÇ  ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ ÀÌ´Â º°·Î ¹®Á¦°¡ µÇÁö ¾Ê´Â
´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÃÖ¼ÒÈ­ ÇÏ·Á¸é ¿©·¯ºÐÀÇ ÇÁ·Î¼¼½º¸¦ nice ¸í·É¾î·Î ³ôÀº ¿ì¼± 
¼øÀ§¸¦ ºÎ¿©ÇÒ ¼ö ÀÖ´Ù. (nice(2)ÀÇ ¸Å´º¾ó ÆäÀÌÁö¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù).

ÀÏ¹Ý »ç¿ëÀÚ ¸ðµåÀÇ  ÇÁ·Î¼¼½º¸¦ Á¤È®ÇÑ Å¸À̹ÖÀ¸·Î ¼öÇà½ÃŰ·Á  ÇÑ´Ù¸é, »ç¿ëÀÚ 
¸ðµåÀÇ `¸®¾ó ŸÀÓ'  ±â´ÉÀÌ Áö¿øµÇ¾î¾ß ÇÑ´Ù. ¸®´ª½º 2.x Ä¿³Î¿¡¼­´Â  ¼ÒÇÁÆ® ¸®
¾ó ŸÀÓ ±â´ÉÀÌ  Áö¿øµÇ¾î¾ß ÇÑ´Ù; ÀÚ¼¼ÇÑ °ÍÀº  sched_setscheduler(2) ¸ÇÆäÀÌÁö
¸¦ ÂüÁ¶ÇÑ´Ù. ÇÏµå ¸®¾ó ŸÀÓÀ»  Áö¿øÇϴ Ưº°ÇÑ Ä¿³ÎÀÌ ÀÖ´Ù. ÀÌ¿¡ ´ëÇÑ ´õ ¸¹
Àº Á¤º¸´Â <URL:<url url="http://luz.cs.nmt.edu/~rtlinux/" name="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ÀÌ´Ù.
<code>
¸í·É          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
</code>
(¹Ì¾ÈÇÏÁö¸¸, ÆæÆ¼¾öÀÇ °æ¿ì´Â Àß ¸ð¸¥´Ù. ¾Æ¸¶µµ 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¾ÆÅ°ÅØÃ³¿¡¼­ ÇÑ Å¬·° »çÀÌŬº¸´Ù  ´õ ªÀº Áö¿¬ ½Ã°£À» ³»±â´Â ºÒ°¡´É
ÇÏ´Ù.
</p>

<sect>        °íÇØ»óµµ ŸÀ̹Ö: ½Ã°£ ÃøÁ¤Çϱâ<p>
ÃÊ´ÜÀ§·Î ½Ã°£À» Á¤È®ÇÏ°Ô ÃøÁ¤ÇÏ´Â ¹æ¹ýÀ¸·Î, time(2)¸¦ »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå ½¬
¿î ¹æ¹ýÀÌ µÉ  °ÍÀÌ´Ù. ´õ Á¤È®ÇÑ ½Ã°£Àº,  gettimeofday(2)´Â ¸¶ÀÌÅ©·ÎÃÊ ´ÜÀ§ÀÇ 
Á¤È®µµ¸¦ Áö¿øÇÑ´Ù (½ºÄÉÁ층¿¡  ´ëÇØ¼­´Â À­ºÎºÐÀ» ÂüÁ¶ÇÑ´Ù.) ÆæÆ¼¾ö¿¡¼­ À§ÀÇ 
ÄÚµå´Â ÇÑ Å¬·° »çÀÌŬ¿¡¼­ Á¤È®ÇÏ´Ù.
¿©·¯ºÐÀÇ  ÇÁ·Î¼¼½º°¡  ÀÏÁ¤  ½Ã°£ÀÌ  Áö³­  ÈÄ¿¡  ½Ã±×³ÎÀ»  ¾ò±â¸¦  ¿øÇÑ´Ù¸é, 
setitimer(2)¸¦ »ç¿ëÇÑ´Ù. ¸Å´º¾ó ÆäÀÌÁö¿¡ ÀÚ¼¼ÇÑ »çÇ×ÀÌ ³ª¿Í ÀÖ´Ù.
</p>

<sect>        ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î<p>
ÀÌ ¼³¸íÀº C  ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ ÁßÁ¡À» µÐ´Ù. ÀÌ´Â C++°ú  Objective C¿¡µµ Á÷
Á¢ Àû¿ëµÇ¾î¾ß ÇÑ´Ù.  ¾î¼Àºí·¯¿¡¼­, ¿©·¯ºÐÀº CÀÇ ioperm()°ú iopl()¸¦  È£ÃâÇØ¾ß 
ÇÏÁö¸¸, Á÷Á¢ ÀÐ°í  ¾µ ¼ö ÀÖ´Â I/O Æ÷Æ®¸¦  »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ ÈÄ¿¡  ±×·¸°Ô µÉ 
°ÍÀÌ´Ù.

´Ù¸¥ ¾ð¾î·Î, ÇÁ·Î±×·¥¿¡ ÀζóÀÎ ¾î¼Àºí·¯³ª  C Äڵ带 »ðÀÔÇÏÁö ¾Ê´Â´Ù¸é, °¡Àå 
½¬¿î ¹æ¹ýÀº ¿©·¯ºÐÀÌ ÇÊ¿ä·Î ÇÏ´Â I/O Æ÷Æ® Á¢±Ù¿¡ »ç¿ëÇÒ ÇÔ¼ö¿¡ °£´ÜÇÑ C ¼Ò
½º ÆÄÀÏÀ»  ÀÛ¼ºÇÏ°í ³ª¸ÓÁö ÇÁ·Î±×·¥°ú  ÄÄÆÄÀÏÇÏ°í ¸µÅ©ÇÏ´Â °ÍÀÌ  µÉ °ÍÀÌ´Ù. 
¶Ç´Â À§¿¡¼­ ¼³¸í ÇÑ´ë·Î /dev/port¸¦ »ç¿ëÇÑ´Ù.
</p>

<sect>        ¸î¸î ¾µ¸¸ÇÑ Æ÷Æ®<p>
¿©±â¿¡´Â ¹ü¿ë TTL ·ÎÁ÷ I/O¿¡  Á÷Á¢ ¾²ÀÌ´Â ÀϹÝÀûÀÎ Æ÷Æ®¿¡ ´ëÇÑ ÇÁ·Î±×·¡¹Ö 
Á¤º¸°¡ ÀÖ´Ù.

ÆÐ·¯·¤ Æ÷Æ® (BASE = 0x3bc for /dev/lp0, 0x378 for /dev/lp1, and 0x278
for  /dev/lp2):  (¿©·¯ºÐÀÌ  Ç¥ÁØ  ÇÁ¸°ÅÍ  ó·³  Á¦¾îÇÏ´Â  ¹æ¹ý¸¸  ÇÊ¿äÇÏ´Ù¸é, 
Printing-HOWTO¸¦ º¸¶ó)
µÚ¿¡ ¼³¸íÇÑ Ç¥ÁØ Ãâ·Â Àü¿ë  ¸ðµå¿¡ µ¡ºÙ¿©¼­, ´ëºÎºÐÀÇ ÇÁ¸°ÅÍ Æ÷Æ®¿¡´Â 'È®Àå
µÈ' ¾ç¹æÇâ ¸ðµå°¡ ÀÖ´Ù. ÀÌ »õ·Î¿î  ECP/EPP ¸ðµå(ÀϹÝÀûÀ¸·Î IEEE 1284 Ç¥ÁØ
ÀÌ¶ó     ÇÑ´Ù)¿¡    ´ëÇÑ     Á¤º¸´Â,     <<url url="http://www.fapo.com/" name="www.fapo.com/" >>    ¿Í 
<<url url="http://www.senet.com.au/~cpeacock/parallel.htm" name="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 ¾ÆÅ°ÅØÃ³°¡  ¾Æ´Ñ °ÍÀÇ º´·Ä Æ÷Æ®´Â  °ÅÀÇ Ç¥ÁØÀ» µû¸£Áö ¸øÇÒ °ÍÀÌ´Ù.   
´õ ÀÚ¼¼ÇÑ Á¤º¸¸¥ ¾Æ·¡¸¦ ÂüÁ¶ÇÑ´Ù. 

<<url url="http://www.hut.fi/~then/circuits/lptpower.html" name="www.hut.fi/~then/circuits/lptpower.html" >>.
¸¶Áö¸·À¸·Î, °æ°í: Á¢Áö ÇÒ ¶§ ÁÖÀÇÇϵµ·Ï ÇÑ´Ù.  ÇÊÀÚ´Â ÄÄÇ»ÅͰ¡ ÄÑ ÀÖÀ» ¶§ ¿¬
°áÀ» ÇØ¼­ º´·Ä Æ÷Æ® ¸î °³¸¦ ¸Á°¡¶ß·È´Ù.  ÀÌ·¯ÇÑ °æ¿ì¿¡´Â º¸µå¿¡ ÅëÇյǾî ÀÖ
Áö ¾ÊÀº º´·Ä Æ÷Æ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀ¸·Î º¸ÀδÙ. (¿©·¯ºÐÀº µÎ¹øÂ° Àú·Å
ÇÑ Ç¥ÁØ `¸ÖƼ-IO'Ä«µå¿¡¼­  º´·Ä Æ÷Æ®¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù; ÇÊ¿ä  ¾ø´Â Æ÷Æ®´Â »ç¿ë
À» ±ÝÁöÇÑ´Ù, ±×¸®°í  Ä«µåÀÇ º´·Ä Æ÷Æ® ÁÖ¼Ò¸¦  ºñ¾î ÀÖ´Â ÁÖ¼Ò·Î Àâ´Â´Ù. º´·Ä 
Æ÷Æ®ÀÇ IRQ¿¡ ´ëÇØ¼­ °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù, »ç½Ç °ÅÀÇ ¾²ÀÌÁö ¾Ê±â ¶§¹®ÀÌ´Ù.
°ÔÀÓ (Á¶À̽ºÆ½) Æ÷Æ® (0x200-0x207 Æ÷Æ®): (ÀÏ¹Ý  Á¶À̽ºÆ½À» Á¦¾îÇϹǷÎ, Ä¿³Î-
¼öÁØÀÇ Á¶À̽ºÆ½ µå¶óÀ̹ö°¡ ÀÖ´Ù. 
<url url="http://te.unc.edu/pub/Linux/kernel/patches/" name="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), 
<<url url="http://www.easysw.com/~mike/serial/index.html" name="www.easysw.com/~mike/serial/index.html">>¸¦ ÂüÁ¶ÇÑ´Ù.
¿©·¯ºÐÀÌ ÁÁÀº ¾Æ³¯·Î±× I/O¸¦ ¿øÇÑ´Ù¸é,  ¿©·¯ºÐÀº ADC¿Í DACĨÀ» º´·Ä Æ÷Æ®
¿¡ ¿¬°áÇÒ ¼ö ÀÖ´Ù. (ÈùÆ®: ÆÄ¿ö¸¦ À§Çؼ­´Â °ÔÀÓ Æ÷Æ® Ä¿³ØÅÍ ¶Ç´Â ÄÄÇ»ÅÍ ÄÉÀÌ
½ºÀÇ ¹Ù±ù¿¡ ¿¬°áÇÏ´Â ¿¹ºñ µð½ºÅ© µå¶óÀ̺êÀÇ  ÆÄ¿ö Ä¿³ØÅ͸¦ »ç¿ëÇÑ´Ù, ¿©·¯ºÐ
ÀÌ ³·Àº Àü·Â ÀåÄ¡¸¦ »ç¿ëÇϰųª ÆÄ¿ö ¶§¹®¿¡ º´·Ä Æ÷Æ® ÀÚü¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â 
°ÍÀÌ ¾Æ´Ï¶ó¸é) ¶Ç´Â, AD/DA Ä«µå¸¦ ±¸ÀÔÇÑ´Ù(´õ ´À¸° Ä«µåµé ´ëºÎºÐÀº I/O Æ÷
Æ®°¡ Á¦¾îÇÑ´Ù). ºÎÁ¤È®ÇÏ°í ¿µÁ¡ ºÒ¾ÈÁ¤ÇÔ¿¡µµ  ÇÑ °³³ª µÎ °³ÀÇ Ã¤³Î¿¡ ¸¸Á·ÇÑ
´Ù¸é, ¸®´ª½º »ç¿îµå µå¶óÀ̹ö¿¡¼­  Áö¿øµÇ´Â Àú°¡ÀÇ »ç¿îµå Ä«µåµµ ÇÒ ¼ö ÀÖ´Ù.
(ÀÌ´Â ÃæºÐÈ÷ ºü¸£´Ù.)

´Ù¸¥ ÈùÆ®:  ¿©·¯ºÐÀÌ ¸®´ª½º¿ë ÇÁ¸°Æ®µÈ  ȸ·Î º¸µå µðÀÚÀÎ ¼ÒÇÁÆ®¿þ¾î¸¦  ã°í 
ÀÖ´Ù¸é, Pcb¶ó ºÒ¸®´Â  °ø°³ÀÇ X11 ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Àִµ¥,  Àß µ¿ÀÛÇÒ °ÍÀÌ´Ù. 
ÃÖ¾ÇÀÇ °æ¿ì ¿©·¯ºÐÀÌ º¹ÀâÇØ¼­ ¾Æ¹«°Íµµ ÇÒ ¼ö ¾øÀ» ¼öµµ ÀÖ´Ù.
ÀÌ     ÇÁ·Î±×·¥Àº      ¸¹Àº     ¸®´ª½º     ¹èÆ÷º»¿¡      Æ÷ÇÔµÇ¾î     ÀÖ°í, 
<url url="http://ite.unc.edu/pub/Linux/apps/circuits/" name="ite.unc.edu/pub/Linux/apps/circuits/" >pcb-*¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù.
</p>

<sect>        ¹®Á¦ ÇØ°á<p>
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 ¼­¹ö ¾îµò°¡¿¡ ÀÖ
´Â) Á¦°ÅÇÏ´Â °ÍÀÌ ÁÁ´Ù.  ±× µå¶óÀ̹ö´Â ¸Å¿ì ´Ù¾çÇÑ ¸ñÀûÀ¸·Î ¾²ÀÏ  ¼ö À־, 
ºñÇ¥ÁØ ÀåÄ¡µµ µ¿ÀÛ½Ã۱⵵  ÇÑ´Ù. ÀÌ ¹®¼­°¡ Á¦½ÃÇϰí Àִ ǥÁØ  Æ÷Æ®¿¡ ´ëÇÑ 
Á¤º¸¸¦ ÂüÁ¶ÇÑ´Ù.
</p>

<sect>        ¼ÒÇÁÆ®¿þ¾î ¿¹Á¦<p>
¿©±â¿¡´Â I/O Æ÷Æ®¸¦ ¿¢¼¼½ºÇÒ¼ö ÀÖ´Â °£´ÜÇÑ ¿¹Á¦ Äڵ尡 ÀÖ´Ù.
<code>
/*
 * 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 */
</code>
</p>

<sect>        °¨»çµå¸± ºÐµé<p>
ÀÏÀÏÀÌ ³ª¿­Çϱ⿡´Â ³Ê¹«³ª ¸¹Àº ºÐµéÀÌ µµ¿òÀÌ µÇ¾ú´Ù, ÇÏÁö¸¸ ¸Å¿ì °¨»çÇÑ´Ù.
Á¶¾ð ¹ÞÀº ¸ðµç  ºÐµé²² ´äÀåÀ» ÇÏÁö´Â ¸øÇÏ¿´´Ù. ÀÌ¿¡ ´ëÇØ  Á˼۽º·´°Ô »ý°¢ÇÏ
°í, ´Ù½Ã Çѹø µµ¿òÀ» Áֽɿ¡ °¨»çµå¸°´Ù.
¸®´ª½º I/O Æ÷Æ® ÇÁ·Î±×·¡¹Ö ¹Ì´Ï ÇÏ¿ìÅõ ³¡
</p>
 </article>

----
[http://?action=keywords&tour=1&all=1 Tags]: [[Keywords(tour)]]



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