ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. ¿ø¹®¹®¼¸¦ Àбâ À§ÇØ ÇÊ¿äÇÑ »çÇ×
Linux µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ÀÛ¼ºÀ» À§Çؼ´Â ¾Æ·¡ÀÇ ÁÖÁ¦¿¡ ´ëÇÑ ÀÌÇØ¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.
User Space¿Í Kerenl space
ÀϹÝÀÀ¿ëÀ» ÀÛ¼ºÇÒ ¶§´Â ÇÊ¿ä ¾øÁö¸¸, µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇϰíÀÚ ÇÑ´Ù¸é, user space¿Í kernel spaceÀÇ Â÷ÀÌÁ¡À» ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.
À¯Àú¿µ¿ª°ú Ä¿³Î¿µ¿ªÀÇ ÀÎÅÍÆäÀ̽º ÇÔ¼ö
Ä¿³ÎÀº ¾ÖÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¡¸Ó°¡ Çϵå¿þ¾î¸¦ Á¦¾îÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ±â À§ÇÑ ¿©·¯°¡Áö ¼ºê·çƾ°ú ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ÀϹÝÀûÀ¸·Î À¯´Ð½º¿Í ¸®´ª½º°°Àº ½Ã½ºÅÛ¿¡¼´Â ÆÄÀϰú °ü·ÃµÈ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼ (ÀåÄ¡¿¡) ÀÐ°í ¾¸À¸·Î½á ÀåÄ¡¸¦ Á¦¾îÇÏ°Ô µÈ´Ù. µð¹ÙÀ̽º µå¶óÀ̹ö´Â ÀÎÅÍÆäÀ̽º °¡´ÉÇÑ Æ¯¼öÇÑ ÆÄÀÏÀ» À¯Àú¿¡°Ô Á¦°øÇÏ°Ô µÇ°í, ÀÌ ÆÄÀÏÀ» ÅëÇØ¼ ÀåÄ¡¸¦ Á¦¾îÇÏ°Ô µÈ´Ù.
¸®´ª½º¿¡¼ µå¹ÙÀ̽º µå¶óÀ̹ö´Â ÇÊ¿äÇÒ ¶§ ÀûÀç µÇ´Â °³³äÀ¸·Î ¸ðµâÇü½ÄÀ¸·Î Á¦°øÀÌ µÈ´Ù. À̸»Àº ¸ðµâÀ» ¿Ã¸®°Å³ª ³»¸®´Â µîÀÇ ÇÔ¼öµéÀÌ ÇÊ¿äÇÏ´Ù¶ó´Â Àǹ̰¡ ÀÖ´Ù. À̸¦ À§Çؼ ¸î°³ÀÇ À¯Àú¿µ¿ª ÇÔ¼öµéÀ» Á¦°øÇÏ°Ô µÇ¸ç, ÇØ´ç À¯Àú¿µ¿ªÀÇ ÇÔ¼ö¸¦ ÅëÇØ¼ ¿äûÀ» ¹Þ´Â Ä¿³Î¿µ¿ªÀÇ ÇÔ¼ö°¡ ½ÖÀ¸·Î Á¸ÀçÇÏ°Ô µÈ´Ù. ¾Æ·¡ÀÇ Å×À̺íÀº µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ Á¦ÀÛÇϱâ À§ÇÑ ÇÔ¼öÅ×À̺íÀÌ´Ù. ¾ÆÁ÷±îÁö´Â ¹è¿î °ÍÀÌ ¾øÀ¸¹Ç·Î ºóÄÀ¸·Î ³²°ÜÁö°Ô µÇ¸ç, ÇнÀÀ» ÇØ°¡¸é¼ ÇϳªÇϳª ä¿ö³ª°¡°Ô µÉ °ÍÀÌ´Ù.
µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ÀûÀç¿Í Á¦°ÅÀ¯Àú ¸ðµå¿¡¼ÀÇ ÀûÀç¿Í Á¦°Å
Ä¿³Î¿¡ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ¿Ã¸®°í ³»¸®´Â °úÁ¤À» ¾Ë¾Æº¸±â À§Çؼ ¾ÆÁÖ °£´ÜÇÑ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ Çϳª ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÄÚµåÀÇ À̸§Àº nothing.c ÀÌ´Ù. include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
´ÙÀ½Àº ÄÄÆÄÀÏ Çϱâ À§ÇÑ make ÆÄÀÏÀÌ´Ù.obj-m := nothing.o¿ÏÀüÇÑ ÄÄÆÄÀÏÀ» ¿øÇÑ´Ù¸é ¾Æ·¡¿Í °°ÀÌ make¿¡ ¸î°¡Áö ¿É¼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù. Ä¿³Î¼Ò½º µð·ºÅ丮´Â ¹èÆ÷ÆÇ ¹öÁ¯¿¡ µû¶ó¼ ¾à°£¾¿ ´Þ¶óÁú ¼ö ÀÖ´Ù. make -C /usr/src/kernel-source-2.6.8 M=`pwd` modulesÄÄÆÄÀÏ ¼º°øÇß´Ù¸é, insmod¸¦ ÅëÇØ¼ ÀûÀç½Ãų ¼ö ÀÖ´Ù. #insmod nothing.ko¿ì¸®°¡ ¸¸µç ¸ðµâÀº ÇÏ´ÂÀÏÀÌ ¾Æ¹« °Íµµ ¾ø±ä ÇÏÁö¸¸, ÀûÀç´Â ¹®Á¦¾øÀÌ µÈ´Ù. ÀûÀçµÈ ¸ðµâÀÇ ¸ñ·ÏÀº lsmod¸¦ ÀÌ¿ëÇØ¼ È®ÀÎÇÒ ¼ö ÀÖ´Ù. # lsmod»ç¿ëÇÏÁö ¾Ê´Â ¸ðµàÀ̶ó¸é Á¦°ÅÇÏ´Â°Ô °ü¸®ÀûÀÎ Ãø¸é¿¡¼ ÁÁÀ» °ÍÀÌ´Ù. rmmod¸¦ ÀÌ¿ëÇØ¼ Á¦°ÅÇÒ ¼ö ÀÖ´Ù. # rmmod nothingÀÌÁ¦ ¿ì¸®´Â ¸ðµâ°ú °ü·ÃµÈ ³»¿ëÁß ÀûÀç¿Í Á¦°Å¿¡ °ü·ÃµÈ 2°¡Áö ¹æ¹ýÀ» ¹è¿ü´Ù.
Ä¿³Î ¸ðµå¿¡¼ÀÇ ÀûÀç¿Í Á¦°Å
±×·³ Ä¿³Î¸ðµå¿¡¼´Â ¾î¶°ÇÑ ¹æ¹ýÀ» ÅëÇØ¼ ¸ðµâÀÇ ÀûÀç¿Í Á¦°Å°¡ °¡´ÉÇÑÁö ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
µð¹ÙÀ̽º µå¶óÀ̹ö ¸ðµâÀ» Ä¿³Î¿¡ ÀûÀçÇÏ·Á¸é, µð¹ÙÀ̽º ÀçÁ¶Á¤, ¸Þ¸ð¸®/interrupts ÇÒ´ç, ÀÔ/Ãâ·Â Æ÷Æ® ÇÒ´çµî°ú °°Àº ¿©·¯°¡Áö ¼±ÇàÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù.
ÀÌ·¯ÇÑ ÀÛ¾÷µéÀº Ä¿³Î¿µ¿ª¿¡¼ ÀÌ·ç¾îÁö¸ç, ÀÌ·¯ÇÑ ÀÛ¾÷À» À§Çؼ module_init¿Í module_exit ¶ó´Â 2°³ÀÇ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. À̵é ÇÔ¼ö´Â °¢°¢ À¯Àú¸ðµå ¸í·É¾îÀÎ insmod¿Í rmmod¿¡ ´ëÀÀµÇ¾î¼ ÀÛµ¿ÀÌ µÈ´Ù.
´ÙÀ½Àº À̵é Ä¿¸Ö¸ðµå ÇÔ¼ö¸¦ Æ÷ÇÔÇÑ Á»´õ º¹ÀâÇÑ ¿¹Á¦ ÄÚµåÀÌ´Ù. #include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk("<1> Hello world!\n");
return 0;
}
static int hello_exit(void)
{
printk("<1> I will be back\n");
}
module_init(hello_init);
module_exit(hello_exit);
¾î·ÆÁö ¾Ê°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. module_init ÇÔ¼ö¿¡¼ ¸ðµâÀÌ ÀûÀçµÉ¶§ È£ÃâµÉ ÇÔ¼ö¸¦ µî·ÏÇϰí, module_exit ÇÔ¼ö¿¡¼ ¸ðµâÀÌ Á¦°ÅµÉ¶§ È£ÃâµÉ ÇÔ¼ö¸¦ µî·ÏÇϰí ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.
¿©±â¿¡¼´Â printk¶ó´Â ÇÔ¼ö°¡ Àִµ¥, Ä¿³Î¿µ¿ª¿¡¼¸¸ ÀÛµ¿ÇÏ´Â °É Á¦¿ÜÇϰí´Â printf(3) ÇÔ¼ö¿Í µ¿ÀÏÇÑ ÀÏÀ» ÇÑ´Ù. <1> Àº ¸Þ½ÃÁöÀÇ ¿ì¼±¼øÀ§¸¦ Á¤Çϱâ À§Çؼ »ç¿ëµÈ´Ù. 1Àº ³ôÀº ¿ì¼±¼øÀ§¸¦ °¡Áö°í ÀÖÀ½À» ÀǹÌÇÑ´Ù. ÀÌµé ¸Þ½ÃÁöµéÀº Ä¿³Î ·Î±× ÆÄÀÏ¿¡ ³²°ÜÁö°Ô µÈ´Ù.
±×·³ ÄÄÆÄÀÏ ÇØ¼ ½ÇÇà½ÃÄѺ¸µµ·Ï ÇÏÀÚ. makeÆÄÀÏÀº À§¿¡ ¸¸µé¾îÁø MakefileÀ» ¾à°£ ¼öÁ¤Çؼ »ç¿ëÇϵµ·Ï ÇÑ´Ù.
ÀÌÁ¦ insmod¿Í rmmod¸¦ ÀÌ¿ëÇØ¼ ÀûÀç¿Í ÇØÁ¦¸¦ ½Ã۵µ·Ï ÇÏÀÚ. ÄܼÖȸéÀ» ÅëÇØ¼´Â ¾î¶²ÀÏÀÌ ÀϾ´ÂÁö È®ÀÎÇÒ ¼ö ¾ø°ÚÁö¸¸ /var/log/syslog ÆÄÀÏÀ» º¸¸é Ä¿³ÎÀÌ ÀûÀçµÇ°í ÇØÁ¦ µÇ¸é¼, module_init¿Í module_exit ÇÔ¼öµéÀÌ ÁÖ¾îÁø ÀÏÀ» ¼öÇàÇßÀ½À» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
ÀÌ·¸°Ô ÇØ¼ ¿ì¸®´Â 2°¡Áö Ä¿³Î¸ðµå ÇÔ¼ö¸¦ Ãß°¡·Î ¹è¿ü´Ù.
Á»´õ ±×·²µíÇÑ µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ÀÛ¼º
±×·³ »ý»ö³»±â ½ÄÀÇ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ñ, Á»´õ Çö½ÇÀûÀÎ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇØ º¸µµ·Ï ÇÏÀÚ. ÀÌ ÇÁ·Î±×·¥Àº ¾Õ¿¡¼ ´Ù·ç¾ú´ø ÇÁ·Î±×·¥µé¿¡ ºñÇØ¼ »ó´çÈ÷ ¸¹Àº ¼öÀÇ include ÆÄÀÏÀ» Æ÷ÇÔÇϰí ÀÖ´Ù. ¸Þ¸ð¸® µå¶óÀ̹ö ÀÛ¼º
À¯´Ð½º¿Í Linux´Â À¯Àú¿µ¿ª¿¡¼ ÀåÄ¡¿¡ ¿¬°áÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÑ Æ¯º°ÇÑ ´Ù¸¥ ¾î¶² °Í´ë½Å, ÀϹÝÀûÀÎ ÆÄÀÏÀ» Á¦°øÇÑ´Ù. ±×·¡¼ ÇÁ·Î±×·¡¸Ó´Â ÀÏ¹Ý ÆÄÀÏÀ» ´Ù·ç´Â °Í°ú ºñ½ÁÇÑ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼ ÀåÄ¡¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ÀåÄ¡ ÆÄÀÏÀº /dev µð·ºÅ丮 ¹Ø¿¡ À§Ä¡ÇÑ´Ù.
ÀÌ ÆÄÀÏÀº major number°ú minor number ¶ó´Â µÎ°³ÀÇ ¼ýÀÚ¸¦ ÅëÇØ¼ Ä¿³Î¸ðµâ°ú ¿¬°áµÈ´Ù. major ¹øÈ£´Â Ä¿³ÎÀÌ µå¶óÀ̹ö¸¦ ÇØ´çµÇ´Â ÆÄÀϰú ¿¬°á½Ã۱â À§Çؼ »ç¿ëÇÑ´Ù. minor ¹øÈ£´Â µå¶óÀ̹ö°¡ ³»ºÎÀûÀ¸·Î »ç¿ëÇÑ´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº ÀÌ ¹®¼ÀÇ ¹üÀ§¸¦ ¹þ¾î³ª±â ¶§¹®¿¡, »ý·«Çϵµ·Ï ÇϰڴÙ.
ÀÌ·¯ÇÑ ÀåÄ¡ÆÄÀÏÀº mknod¶ó´Â ¸í·ÉÀ» ÀÌ¿ëÇØ¼ »ý¼ºÇÒ ¼ö ÀÖ´Ù. # mknod /dev/memory c 60 0c´Â charactor µð¹ÙÀ̽º ³ëµå¸¦ ¸¸µç´Ù´Â ¶æÀÌ´Ù. ºí·° µð¹ÙÀ̽º(Ç÷¡½ÃµîÀÇ ÀúÀå¸Åü)¸¦ ¸¸µé·Á¸é b¸¦ ³Ö¾î ÁØ´Ù. ³×Æ®¿öÅ© µð¹ÙÀ̽º´Â ÆÄÀÏ·ÎµÈ ³ëµå¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î mknod¿¡´Â ÇØ´ç»çÇ×ÀÌ ¾ø´Ù. 60Àº major ¹øÈ£ 0Àº minor ¹øÈ£´Ù.
Ä¿³ÎÀº register_chrdev¶ó´Â Ä¿³Î¿µ¿ª ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ÇØ´ç µå¶óÀ̹ö¿Í ´ëÀÀµÇ´Â ÀåÄ¡ÆÄÀÏÀ» /dev¿¡¼ ã¾Æ¼ ¿¬°á½ÃŲ´Ù. ÀÌ ÇÔ¼ö´Â major ¹øÈ£, ¸ðµâÀ̸§, file_operations ±¸Á¶Ã¼¸¦ ÀÎÀڷΠȣÃâµÈ´Ù. file_operations ±¸Á¶Ã¼¿¡´Â ¿¬°áµÇ¾îÁø ÀåÄ¡ÆÄÀÏ·Î ºÎÅÍ À̺¥Æ®°¡ ¹ß»ýÇßÀ» ¶§, °¢ À̺¥Æ®º°·Î È£ÃâµÈ ÇÔ¼öµéÀ» Á¤ÀÇÇÑ´Ù. ÀåÄ¡ÆÄÀÏ·Î ºÎÅÍ ¹ß»ýÇÏ´Â À̺¥Æ®´Â read, write, open, release°¡ ÀÖ´Ù. /* Necessary includes for device drivers */ #include <linux/init.h> #include <linux/config.h> #include <linux/module.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* everything... */ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <asm/system.h> /* cli(), *_flags */ #include <asm/uaccess.h> /* copy_from/to_user */ MODULE_LICENSE("Dual BSD/GPL"); /* Declaration of memory.c functions */ int memory_open(struct inode *inode, struct file *filp); int memory_release(struct inode *inode, struct file *filp); ssize_t memory_read(struct file *filp, char *buf, size_t count, loff_t *f_pos); ssize_t memory_write(struct file *filp, char *buf, size_t count, loff_t *f_pos); void memory_exit(void); int memory_init(void); /* Structure that declares the usual file */ /* access functions */ struct file_operations memory_fops = { read: memory_read, write: memory_write, open: memory_open, release: memory_release }; /* Declaration of the init and exit functions */ module_init(memory_init); module_exit(memory_exit); /* Global variables of the driver */ /* Major number */ int memory_major = 60; /* Buffer to store data */ char *memory_buffer; int memory_init(void) { int result; /* Registering device */ result = register_chrdev(memory_major, "memory", &memory_fops); if (result < 0) { printk( "<1>memory: cannot obtain major number %d\n", memory_major); return result; } /* Allocating memory for the buffer */ memory_buffer = kmalloc(1, GFP_KERNEL); if (!memory_buffer) { result = -ENOMEM; goto fail; } memset(memory_buffer, 0, 1); printk("<1>Inserting memory module\n"); return 0; fail: memory_exit(); return result; } void memory_exit(void) { /* Freeing the major number */ unregister_chrdev(memory_major, "memory"); /* Freeing buffer memory */ if (memory_buffer) { kfree(memory_buffer); } printk("<1>Removing memory module\n"); } int memory_open(struct inode *inode, struct file *filp) { /* Success */ return 0; } int memory_release(struct inode *inode, struct file *filp) { /* Success */ return 0; }
µå¶óÀ̹öÀÇ Á¦°Å´Â memory_exit ÇÔ¼ö¿¡¼ unregister_chrdev ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù. kmalloc()´Â Ä¿³Î³»ºÎ¿¡¼ »ç¿ëÇÏ´Â ¸Þ¸ð¸® ÇÒ´çÇÔ¼öÀ̸ç, malloc()·Î ÇÒ´çÇÑ ÇÔ¼ö¸¦ free()·Î µÇµ¹·ÁÁà¾ß ÇϵíÀÌ, ¹Ýµå½Ã kfree() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ µÇµ¹·ÁÁÖ¾î¾ß ÇÑ´Ù.
À̻󿡼 ¿ì¸®´Â ÀåÄ¡¸¦ ¿±â/´Ý±â À§ÇÑ ÇÔ¼ö¸¦ Ãß°¡ÀûÀ¸·Î ¹è¿ü´Ù.
´ÙÀ½Àº ÀÐ°í ¾²±â À§ÇÑ memory_readÇÔ¼ö¿Í memory_writeÇÔ¼öÀÇ Á¤ÀÇ´Ù. ssize_t memory_read(struct file *filp, char *buf,
size_t count, loff_t *f_pos) {
/* Transfering data to user space */
copy_to_user(buf,memory_buffer,1);
/* Changing reading position as best suits */
if (*f_pos == 0) {
*f_pos+=1;
return 1;
} else {
return 0;
}
}
ssize_t memory_write( struct file *filp, char *buf,
size_t count, loff_t *f_pos) {
char *tmp;
tmp=buf+count-1;
copy_from_user(memory_buffer,tmp,1);
return 1;
}
ÄÄÆÄÀÏÀ» ÇÑ ´ÙÀ½¿¡´Â insmod¸¦ ÅëÇØ¼ ¿Ã¸®°í echo ¿Í catÀ» ÀÌ¿ëÇØ¼ Àаí/¾²±â Å×½ºÆ®¸¦ ÇÒ ¼ö ÀÖ´Ù.# insmod memory.ko # echo -n abcdef > /dev/memory # cat /dev/memoryf°¡ Ãâ·ÂµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. º´·Ä Æ÷Æ® µå¶óÀ̹ö ÀÛ¼º
±×·³ ½ÇÁ¦ »ç¿ë°¡´ÉÇÑ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇØ º¸µµ·Ï ÇϰڴÙ. ¸¸µé µð¹ÙÀ̽º µå¶óÀ̹ö´Â parlelport¶ó°í ¸í¸íÇÒ °ÍÀÌ´Ù.
º´·ÄÆ÷Æ®´Â µðÁöÅÐ Á¤º¸ÀÇ ÀÔÃâ·ÂÀ» À§ÇÑ ÀÏÀ» ÇÏ´Â ÄÄÇ»ÅÍ ÀåÄ¡·Î D-25 connector¿Í 25°³ÀÇ ÇÉÀ» Á¦°øÇÑ´Ù. PC´Â ÀåÄ¡¸¦ °¡¸®Å°´Â ù¹øÂ° ÁÖ¼Ò·Î 0x378À» »ç¿ëÇÑ´Ù. ¾Æ·¡ÀÇ ±×¸²Àº ¿ÜºÎ ÄÁÅÙÆ®Çɰú Á¢±ÙÇÏ´Â ÁÖ¼Ò¸¦ ±â¼úÇϰí ÀÖ´Ù. ![]() ¸ðµâÃʱâÈ Çϱâ
ÀÌÀü¿¡ ´Ù·ç¾ú´ø memory_init ÇÔ¼ö¸¦ ¾à°£ ¼öÁ¤Çؼ »ç¿ëÇϵµ·Ï ÇÒ°ÍÀÌ´Ù. ÀÌ ÃʱâÈ ÇÔ¼ö´Â º´·ÄÆ÷Æ®ÀÇ ¸Þ¸ð¸® ÁÖ¼ÒÀÎ 0x378À» ¿¹¾àÇÑ´Ù. ¿ì¼± check_regionÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼, ÇØ´ç ¸Þ¸ð¸®¿µ¿ªÀÌ »ç¿ë°¡´ÉÇÑÁö¸¦ üũÇÑ´Ù. ¸¸¾à »ç¿ë°¡´ÉÇÏ´Ù¸é ÀåÄ¡¸¦ À§ÇÑ ¸Þ¸ð¸® ¿µ¿ªÀ» ¿¹¾àÇÏ°Ô µÈ´Ù. check_region ÇÔ¼ö´Â µÎ°³ÀÇ ÀÎÀÚ¸¦ °¡Áø´Ù. ù¹øÂ° ÀÎÀÚ´Â ¸Þ¸ð¸®¿µ¿ªÀÇ ÁÖ¼ÒÀ̸ç, µÎ¹øÂ° ÀÎÀÚ´Â ¸Þ¸ð¸® ¿µ¿ªÀÇ Å©±â´Ù. /* Registering port */ port = check_region(0x378, 1); if (port) { printk("<1>parlelport: cannot reserve 0x378\n"); result = port; goto fail; } request_region(0x378, 1, "parlelport"); ¸ðµâ Á¦°ÅÇϱâ
µå¶óÀ̹ö´Â Á¦°ÅµÇ±â Àü¿¡ ±âÁ¸¿¡ »ç¿ëÇß´ø ÀÚ¿øÀ» Ä¿³Î¿¡ µÇµ¹·ÁÁà¾ß ÇÑ´Ù. ÇØ¼ ¸ðµâÀ» ÃʱâÈ ÇÏ¸é¼ ÇÒ´ç ¹Þ¾Ò´ø, ÀåÄ¡ µå¶óÀ̹öÀÇ ¸Þ¸ð¸®¿µ¿ªÀ» µÇµ¹·ÁÁÖ´Â ÀÏÀ» ÇÏ´Â Äڵ带 ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ÀÏÀº release_regionÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ¼öÇàÇϵµ·Ï ÇÑ´Ù. if (!port)
{
release_region(0x378,1);
}
ÀåÄ¡·Î ºÎÅÍ Àбâ
ÀåÄ¡ µå¶óÀ̹öÀÇ °¡Àå Áß¿äÇÑ ¿ªÇÒÀº ÀåÄ¡·Î ºÎÅÍ ÀÐÀº µ¥ÀÌÅ͸¦ À¯Àú ¿µ¿ª¿¡ µÇµ¹·ÁÁÖ´Â ÀÏÀÌ´Ù. inb ÇÔ¼ö´Â ÇØ´ç ÁÖ¼Ò·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àаí À̸¦ ¹öÆÛ¿¡ ´ã¾ÆµÎ´Â ÀÏÀ» ÇÑ´Ù.
ÀåÄ¡¿¡ ¾²±â
ÀåÄ¡·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àд ÇÔ¼ö¸¦ ¸¸µé¾úÀ¸´Ï, ÀÌÁ¦ ÀåÄ¡·Î µ¥ÀÌÅ͸¦ ¾²´Â ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â À¯Àú ¿µ¿ªÀÇ µ¥ÀÌÅ͸¦ Àоî¼, ÀåÄ¡°¡ ÀÐÀ» ¼ö ÀÖ´Â µ¥ÀÌÅÍ·Î º¯È¯ÇÑ ÈÄ ¾²´Â ÀÏÀ» ÇÑ´Ù. ÇÔ¼öÀÇ À̸§Àº outb À̸ç, µÎ¹øÂ° ÀÎÀÚ·Î ÁÖ¾îÁø ÁÖ¼Ò ¿µ¿ª¿¡, ù¹øÂ° ÀÎÀÚ·Î ÁÖ¾îÁø µ¥ÀÌÅ͸¦ ¾´´Ù.
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|