»ç¿ëÀÚ ¼öÁØ ÀÔÃâ·ÂÀº À̸¦ ÅëÇØ ÇÁ·Î±×·¡¸Ó°¡ ÁÖº¯ ±â±â¿¡ ´ëÇÏ¿© À¯¿¬ÇÏ°í È¿À²ÀûÀÎ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ÇØÁֱ⠶§¹®¿¡ ³»ÀåÇü ½Ç½Ã°£ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ Á¡Â÷ ±× Á߿伺ÀÌ ´õÇØÁö°í ÀÖ´Ù. ³»ÀåÇü ½Ã½ºÅÛ¿¡¼ »ç¿ëÀÚ ¼öÁØ ÀÔÃâ·ÂÀ» Áö¿øÇϱâ À§Çؼ´Â ¿î¿µÃ¼Á¦°¡ ÀÔÃâ·Â µð¹ÙÀ̽º·Î ºÎÅÍ ÇÁ·Î¼¼½º·Î ¿¹Ãø °¡´ÉÇÏ°í È¿À²ÀûÀÎ ¹æ¹ýÀ¸·Î ¿ÜºÎ ÀÎÅÍ·´Æ®¸¦ Àü´ÞÇÏ´Â ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇØ¾ß ÇÑ´Ù. Arx¿¡¼´Â È¿À²ÀûÀÎ »õ·Ó°Ô ¼³°èµÈ »ç¿ëÀÚ ¼öÁØ ½Ã±×³¯ ¸ÞÄ¿´ÏÁò¿¡ ±â¹ÝÀ» µÐ »ç¿ëÀÚ ¼öÁØ ÀÔÃâ·Â ½ºÅ´À» Á¦°øÇÑ´Ù. °¡»ó ¾²·¹µå³ª ½ºÄÉÁ층 À̺¥Æ® ¾÷ÄÝ°ú °°Àº Ä¿³ÎÀÇ ´ÙÁß ¾²·¹µå ¾ÆÅ°ÅØÃĸ¦ Àß È°¿ëÇÑ ÀÌ·¯ÇÑ ½ºÅ´Àº ±âÁ¸ÀÇ ÀüÅëÀûÀÎ ½Ã±×³¯ ±¸ÇöÀÇ ¹®Á¦Á¡µéÀ» ±Øº¹ÇÒ ¼ö ÀÖ´Ù.
»ç¿ëÀÚ ¼öÁØ ÀÔÃâ·ÂÀ» Áö¿øÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥ ÀÎÅÍÆäÀ̽º(API)°¡ ¾Æ·¡¿Í °°´Ù.
uio_request(ioa_start, ioa_end, [type]): ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ ÇÁ·Î¼¼½º°¡ ioa_startºÎÅÍ ioa_end±îÁöÀÇ ÀÔÃâ·Â ÁÖ¼Ò¸¦ Á¢±ÙÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀ» ¾ò°Ô ÇØÁØ´Ù. ÀÌ ¿µ¿ªÀÇ ÁÖ¼Ò°¡ memory-mapped µð¹ÙÀ̽ºµé ¿¡ ÇØ´çÇÑ´Ù¸é ¹Ýµå½Ã page-alignµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ¸¶ÀÌÅ©·Î ÇÁ·Î¼¼¼°¡ ÀÔÃâ·Â µð¹ÙÀ̽ºµé¿¡ ´ëÇÏ¿© I/O mapped¿Í memory-mapped ÁÖ¼Ò¸¦ µ¿½Ã¿¡ Áö¿øÇÑ´Ù¸é ÁÖ¼ÒÀÇ Å¸ÀÔÀÌ type ÆÛ¶ó¹ÌÅÍ¿¡ IOMAPÀ̳ª MEMORYMAP ÁßÀÇ Çϳª·Î ¹Ýµå½Ã ¸í½ÃµÇ¾î¾ß ÇÑ´Ù. Ä¿³ÎÀº »ç¿ëÀÚ ÇÁ·Î¼¼½ºµé¿¡°Ô ±ÇÇÑÀ» ºÎ¿©ÇÑ ÁÖ¼Ò ½ÖµéÀÇ ¸®½ºÆ®µéÀ» °ü¸®ÇÑ´Ù. È£ÃâµÇ¾îÁö¸é, ¸®½ºÆ®¸¦ »ç¿ëÇÏ¿© »ç¿ëÀÚ ¼öÁØ ÀÔÃâ·Â Ãæµ¹À» °Ë»çÇÑ´Ù. Ãæµ¹ÀÌ ¹ß°ßµÇÁö ¾ÊÀ¸¸é ½ÂÀÎµÈ ÁÖ¼Ò¸¦ ³ªÅ¸³»´Â integer handleÀ» ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù. Arx Ä¿³ÎÀº ±â¹ÝÀÇ ¸¶Ä¡Å©·Î ÇÁ·Î¼¼¼ÀÇ ¸Þ¸ð¸® º¸È£ ¸ÞÄ¿´ÏÁòÀ¸·Î ÀÔÃâ·Â ÁÖ¼Ò º¸È£¸¦ ½ÇÇöÇÑ´Ù. ¸¸¾à ÇÑ °³ÀÇ ÆäÀÌÁö°¡ ¸î °³ÀÇ ´Ù¸¥ µð¹ÙÀ̽ºµéÀÇ ¸Þ¸ð¸® ÁÖ¼ÒµéÀ» ó¸®ÇÑ´Ù¸é, ÇÑ°³ÀÇ ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ÇÁ·Î¼¼½ºµé¿¡ ÀÇÇÏ¿© ¼ÒÀ¯µÇ´Â µð¹ÙÀ̽ºµéÀ» Á¢±ÙÇÒ °¡´É¼ºÀÌ ÀÖ´Ù. µû¶ó¼ uio_request´Â memory-mapped µð¹ÙÀ̽ºµéÀÌ page-alignedÀ̱⸦ ¿ä±¸ÇÑ´Ù.
uio_release(handle): ÀÌ ÇÔ¼ö´Â handle·Î ³ªÅ¸³»¾îÁö´Â µð¹ÙÀ̽ºÀÇ Áּҵ鿡 ´ëÇÑ Á¢±Ù ±ÇÇÑÀ» ÇØÁ¦ÇÑ´Ù.
uio_int_request(irq, handler, type, flag): ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ ÀÎÅÍ·´Æ® Çڵ鷯¸¦ µî·ÏÇÑ´Ù. type ÀÎÀÚ´Â KERNEL_DISPATCH³ª USER_DISPATCH ÁßÀÇ Çϳª°¡ µÉ ¼ö ÀÖ´Ù. USER_DISPATCH°¡ ¼±ÅõǸé ÀÌ ÇÔ¼ö´Â ÀÎÅÍ·´Æ®¸¦ SIGRTMIN°ú SIFGRTMAX»çÀÌ¿¡¼ ¼±ÅÃµÈ ºñ¾îÀÖ´Â ½Ã±×³¯ ¹øÈ£¸¦ ÇÒ´çÇÑ´Ù. ¸¸¾à È£ÃâÇÑ ÇÁ·Î¼¼½º°¡ ´ÙÁß ¾²·¹µå ÀÀ¿ë ÇÁ·Î±×·¥À̶ó¸é, ÀÌ ÇÔ¼ö´Â handler ¾²·¹µå¸¦ »ý¼ºÇÑ´Ù. flag ÀÎÀÚ°¡ 0À̶ó¸é ÀÎÅÍ·´Æ®¸¦ ¸·Àº »óÅ¿¡¼ ¸®ÅÏÇÑ´Ù. ÀÌ ÇÔ¼ö°¡ ¼º°øÀûÀ¸·Î ¼öÇàÀ» ¸¶Ä¡¸é irq ¹øÈ£¿Í ½Ã±×³¯ ¹øÈ£ ¹× ¾²·¹µå ½Äº°ÀÚ¸¦ Æ÷ÇÔÇÏ´Â irq_info ±¸Á¶Ã¼¸¦ ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, error¸¦ ¾Ï½ÃÇϸç, 0À» ¸®ÅÏÇÑ´Ù. ¾²·¹µå ½Äº°ÀÚ´Â ÇÁ·Î¼¼½º°¡ ¿ì¼±¼øÀ§ °°Àº handler ¾²·¹µåÀÇ ¼Ó¼ºÀ» Á¦¾îÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÏ¿© ÇÊ¿äÇÑ´Ù.
uio_int_release(irq, flag): ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ ÀÎÅÍ·´Æ® Çڵ鷯ÀÇ µî·ÏÀ» ÇØÁ¦ÇÑ´Ù. flag ÀÎÀÚ°¡ 1À̸é, ¿¬°üµÈ handler ¾²·¹µåµµ Ãë¼Ò½ÃŲ´Ù.
uio_int_enable(irq), uio_int_disable(irq): ÀÌ ÇÔ¼ö´Â ÀÎÅÍ·´Æ®¸¦ °¡´ÉÇÏ°Ô Çϰųª ¸·´Â´Ù. ¸¸¾à µî·ÏµÈ Çڵ鷯°¡ ½Ã±×³¯ ±â¹Ý Çڵ鷯¶ó¸é, ½ÇÁ¦ÀÇ ÀÎÅÍ·´Æ®¸¦ ¸·Áö ¾Ê°í ´ÜÁö °ü·ÃµÈ ½Ã±×³¯À» maskÇϰųª unmaskÇÑ´Ù.
º» ½ÇÇè½Ç¿¡¼´Â Arx¿¡¼ÀÇ »ç¿ëÀÚ ¼öÁØ ÀÔÃâ·ÂÀÇ ¼º´ÉÀ» Áõ¸íÇϱâ À§ÇÏ¿© ´Ù¹æ¸é¿¡¼ ½ÇÇèÀ» ÇØ¿Ô´Ù. ½ÇÇèµéÀº ¸í¹éÇÏ°Ô ArxÀÇ »ç¿ëÀÚ ¼öÁØ ÀÔÃâ·Â ½ºÅ´ÀÌ ÀûÀº ¿À¹öÇìµå·Î ¿ÜºÎ ÀÎÅÍ·´Æ®ÀÇ ¿¹Ãø°¡´ÉÇÑ Àü´ÞÀ» °¡´ÉÇÏ°Ô ÇÔÀ» º¸¿©ÁØ´Ù.
ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ÀÇ ¹®¼¸¦ Âü°íÇϱ⠹ٶõ´Ù.
Efficient User-Level I/O in the ARX Real-Time Operating System.
1998 ACM Workshop on Languages, Compilers, and Tools for Embedded Systems. pp. 162-171, Monteal, Canada, June 1998.
Y. Seo, J. Park, and S. Hong.