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()¿Í À§ÀÇ ¸ÅÅ©·Î¿¡ ´ë ÇÑ ¸Å´º¾ó ÆäÀÌÁö°¡ ÀÖ´Ù.