Linux Ä¿³Î¿¡¼­ÀÇ µð¹ÙÀ̽º µå¶óÀ̹ö ÀÛ¼º
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
[http]¿ø¹®

Replace original file
Rename if it already exist

¹®¼­¸¦ Àбâ À§ÇØ ÇÊ¿äÇÑ »çÇ×

Linux µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ÀÛ¼ºÀ» À§Çؼ­´Â ¾Æ·¡ÀÇ ÁÖÁ¦¿¡ ´ëÇÑ ÀÌÇØ¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.
  • C ÇÁ·Î±×·¡¹Ö, Æ÷ÀÎÅͰú ºñÆ®¸¦ ´Ù·ç´Â ÀÛ¾÷ÀÌ ¸¹±â ¶§¹®¿¡, Áß±Þ ¼öÁØÁ¤µµÀÇ C ÇÁ·Î±×·¡¹Ö ´É·ÂÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.
  • Microprocessor(:12) ÇÁ·Î±×·¡¹Ö : memory addressing, interruptsµî°ú °°Àº ¸¶ÀÌÅ©·ÎÄÄÇ»ÅÍ ³»ºÎ±¸¼º ¿ä¼Ò¿¡ ´ëÇÑ ÀÌÇØ¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ÀÌ·¯ÇÑ °ÍµéÀº assembly ÇÁ·Î±×·¡¸ÓÀÇ Çʼö »çÇ×À̱⵵ ÇÏ´Ù.

¿©±â¿¡¼­´Â ¸î°¡Áö Á¾·ùÀÇ ¸®´ª½º µå¶óÀ̹ö¸¦ ¸¸µé¾î º¼°ÍÀÌ´Ù. ¹®¼­´Â Linux Kernel 2.6.x¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù. Âü°í·Î ÇÊÀÚÀÇ È¯°æÀº Ubuntu Kernel 2.6.12 ÀÌ´Ù.

User Space¿Í Kerenl space

ÀϹÝÀÀ¿ëÀ» ÀÛ¼ºÇÒ ¶§´Â ÇÊ¿ä ¾øÁö¸¸, µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇϰíÀÚ ÇÑ´Ù¸é, user space¿Í kernel spaceÀÇ Â÷ÀÌÁ¡À» ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.
  • Kernel space. Ä¿³ÎÀÌ ÇÏ´Â ÀÏÀº °á±¹ ÄÄÇ»ÅÍÀÇ Çϵå¿þ¾î¸¦ Á¦¾îÇÏ´Â ÀÏÀÏ °ÍÀ̰í, Ä¿³Î·Î ÇÏ¿©±Ý ƯÁ¤ Çϵå¿þ¾î¸¦ Á¦¾îÇϰԲû ¸í¼¼¼­¸¦ ÀÛ¼ºÇÏ´Â°Ô ÇÁ·Î±×·¡¸Ó°¡ ÇÏ´Â ÀÏÀÌ´Ù. ±×·¸´Ù¸é ÇÁ·Î±×·¡¸Ó°¡ °£´ÜÇÏ°Ô Çϵå¿þ¾î¸¦ Á¦¾îÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÒ Çʿ䰡 ÀÖ´Ù. ÀÌ·¸°Ô ÇÁ·Î±×·¡¸Ó¿Í Çϵå¿þ¾î °£ÀÇ ÀÎÅÍÆäÀ̽º(°¡±³)¿ªÇÒÀ» ´ã´çÇÏ´Â°Ô device driverÀÌ´Ù. ÀÌ·¯ÇÑ ÀåÄ¡µå¶óÀ̹ö´Â Ä¿³ÎÀÇ ÀϺκÐÀ¸·Î½á ÀÛµ¿Çϱ⠶§¹®¿¡ Kernel space ¿µ¿ª¿¡¼­ ÀÛµ¿ÇÑ´Ù¶ó°í ¸»ÇÑ´Ù.
  • user space. À¯´Ð½º shellÀ̳ª GUI ¾ÖÇø®ÄÉÀ̼ǵéÀº user space¿¡¼­ ÀÛµ¿À» ÇÑ´Ù. ÀÌ·¯ÇÑ ¾ÖÇø®ÄÉÀ̼ǵµ ÀÛµ¿À» À§Çؼ­´Â ½Ã½ºÅÛÀÇ Çϵå¿þ¾î¸¦ Á¦¾îÇØ¾ß ÇϰÚÁö¸¸, Á÷Á¢ÀûÀ¸·Î Á¦¾î¸¦ ÇÒ ¼ö´Â ¾ø´Ù. Ä¿³Î¿¡¼­ Á¦°øÇÏ´Â ÇÔ¼ö¸¦ ÅëÇØ¼­, ¿äûÇü½ÄÀ¸·Î¸¸ Á¦¾î¸¦ ÇÒ ¼ö ÀÖ´Ù.


À¯Àú¿µ¿ª°ú Ä¿³Î¿µ¿ªÀÇ ÀÎÅÍÆäÀ̽º ÇÔ¼ö

Ä¿³ÎÀº ¾ÖÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¡¸Ó°¡ Çϵå¿þ¾î¸¦ Á¦¾îÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ±â À§ÇÑ ¿©·¯°¡Áö ¼­ºê·çƾ°ú ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ÀϹÝÀûÀ¸·Î À¯´Ð½º¿Í ¸®´ª½º°°Àº ½Ã½ºÅÛ¿¡¼­´Â ÆÄÀϰú °ü·ÃµÈ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼­ (ÀåÄ¡¿¡) ÀÐ°í ¾¸À¸·Î½á ÀåÄ¡¸¦ Á¦¾îÇÏ°Ô µÈ´Ù. µð¹ÙÀ̽º µå¶óÀ̹ö´Â ÀÎÅÍÆäÀ̽º °¡´ÉÇÑ Æ¯¼öÇÑ ÆÄÀÏÀ» À¯Àú¿¡°Ô Á¦°øÇÏ°Ô µÇ°í, ÀÌ ÆÄÀÏÀ» ÅëÇØ¼­ ÀåÄ¡¸¦ Á¦¾îÇÏ°Ô µÈ´Ù.

¸®´ª½º¿¡¼­ µå¹ÙÀ̽º µå¶óÀ̹ö´Â ÇÊ¿äÇÒ ¶§ ÀûÀç µÇ´Â °³³äÀ¸·Î ¸ðµâÇü½ÄÀ¸·Î Á¦°øÀÌ µÈ´Ù. À̸»Àº ¸ðµâÀ» ¿Ã¸®°Å³ª ³»¸®´Â µîÀÇ ÇÔ¼öµéÀÌ ÇÊ¿äÇÏ´Ù¶ó´Â Àǹ̰¡ ÀÖ´Ù. À̸¦ À§Çؼ­ ¸î°³ÀÇ À¯Àú¿µ¿ª ÇÔ¼öµéÀ» Á¦°øÇÏ°Ô µÇ¸ç, ÇØ´ç À¯Àú¿µ¿ªÀÇ ÇÔ¼ö¸¦ ÅëÇØ¼­ ¿äûÀ» ¹Þ´Â Ä¿³Î¿µ¿ªÀÇ ÇÔ¼ö°¡ ½ÖÀ¸·Î Á¸ÀçÇÏ°Ô µÈ´Ù. ¾Æ·¡ÀÇ Å×À̺íÀº µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ Á¦ÀÛÇϱâ À§ÇÑ ÇÔ¼öÅ×À̺íÀÌ´Ù. ¾ÆÁ÷±îÁö´Â ¹è¿î °ÍÀÌ ¾øÀ¸¹Ç·Î ºóÄ­À¸·Î ³²°ÜÁö°Ô µÇ¸ç, ÇнÀÀ» ÇØ°¡¸é¼­ ÇϳªÇϳª ä¿ö³ª°¡°Ô µÉ °ÍÀÌ´Ù.

Events À¯Àú ÇÔ¼ö Ä¿³Î ÇÔ¼ö
Load module
Open device
Close device
Write device
Read device
Close device
Remove module

µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ÀûÀç¿Í Á¦°Å

À¯Àú ¸ðµå¿¡¼­ÀÇ ÀûÀç¿Í Á¦°Å

Ä¿³Î¿¡ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ¿Ã¸®°í ³»¸®´Â °úÁ¤À» ¾Ë¾Æº¸±â À§Çؼ­ ¾ÆÁÖ °£´ÜÇÑ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ Çϳª ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÄÚµåÀÇ À̸§Àº 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°¡Áö ¹æ¹ýÀ» ¹è¿ü´Ù.

Events À¯Àú ÇÔ¼ö Ä¿³Î ÇÔ¼ö
Load module insmod
Open device
Close device
Write device
Read device
Close device
Remove module rmmod

Ä¿³Î ¸ðµå¿¡¼­ÀÇ ÀûÀç¿Í Á¦°Å

±×·³ Ä¿³Î¸ðµå¿¡¼­´Â ¾î¶°ÇÑ ¹æ¹ýÀ» ÅëÇØ¼­ ¸ðµâÀÇ ÀûÀç¿Í Á¦°Å°¡ °¡´ÉÇÑÁö ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

µð¹ÙÀ̽º µå¶óÀ̹ö ¸ðµâÀ» Ä¿³Î¿¡ ÀûÀçÇÏ·Á¸é, µð¹ÙÀ̽º ÀçÁ¶Á¤, ¸Þ¸ð¸®/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°¡Áö Ä¿³Î¸ðµå ÇÔ¼ö¸¦ Ãß°¡·Î ¹è¿ü´Ù.
Events À¯Àú ÇÔ¼ö Ä¿³Î ÇÔ¼ö
Load module insmod module_init()
Open device
Close device
Write device
Read device
Close device
Remove module rmmod module_exit()

Á»´õ ±×·²µíÇÑ µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ÀÛ¼º

±×·³ »ý»ö³»±â ½ÄÀÇ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ñ, Á»´õ Çö½ÇÀûÀÎ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇØ º¸µµ·Ï ÇÏÀÚ. ÀÌ ÇÁ·Î±×·¥Àº ¾Õ¿¡¼­ ´Ù·ç¾ú´ø ÇÁ·Î±×·¥µé¿¡ ºñÇØ¼­ »ó´çÈ÷ ¸¹Àº ¼öÀÇ include ÆÄÀÏÀ» Æ÷ÇÔÇϰí ÀÖ´Ù.
 

¸Þ¸ð¸® µå¶óÀ̹ö ÀÛ¼º

À¯´Ð½º¿Í Linux´Â À¯Àú¿µ¿ª¿¡¼­ ÀåÄ¡¿¡ ¿¬°áÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÑ Æ¯º°ÇÑ ´Ù¸¥ ¾î¶² °Í´ë½Å, ÀϹÝÀûÀÎ ÆÄÀÏÀ» Á¦°øÇÑ´Ù. ±×·¡¼­ ÇÁ·Î±×·¡¸Ó´Â ÀÏ¹Ý ÆÄÀÏÀ» ´Ù·ç´Â °Í°ú ºñ½ÁÇÑ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼­ ÀåÄ¡¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ÀåÄ¡ ÆÄÀÏÀº /dev µð·ºÅ丮 ¹Ø¿¡ À§Ä¡ÇÑ´Ù.

ÀÌ ÆÄÀÏÀº major number°ú minor number ¶ó´Â µÎ°³ÀÇ ¼ýÀÚ¸¦ ÅëÇØ¼­ Ä¿³Î¸ðµâ°ú ¿¬°áµÈ´Ù. major ¹øÈ£´Â Ä¿³ÎÀÌ µå¶óÀ̹ö¸¦ ÇØ´çµÇ´Â ÆÄÀϰú ¿¬°á½Ã۱â À§Çؼ­ »ç¿ëÇÑ´Ù. minor ¹øÈ£´Â µå¶óÀ̹ö°¡ ³»ºÎÀûÀ¸·Î »ç¿ëÇÑ´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº ÀÌ ¹®¼­ÀÇ ¹üÀ§¸¦ ¹þ¾î³ª±â ¶§¹®¿¡, »ý·«Çϵµ·Ï ÇϰڴÙ.

ÀÌ·¯ÇÑ ÀåÄ¡ÆÄÀÏÀº mknod¶ó´Â ¸í·ÉÀ» ÀÌ¿ëÇØ¼­ »ý¼ºÇÒ ¼ö ÀÖ´Ù.
# mknod /dev/memory c 60 0 
 
c´Â 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() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ µÇµ¹·ÁÁÖ¾î¾ß ÇÑ´Ù.

À̻󿡼­ ¿ì¸®´Â ÀåÄ¡¸¦ ¿­±â/´Ý±â À§ÇÑ ÇÔ¼ö¸¦ Ãß°¡ÀûÀ¸·Î ¹è¿ü´Ù.
Events À¯Àú ÇÔ¼ö Ä¿³Î ÇÔ¼ö
Load module insmod module_init()
Open device fopen() file_operations:open
Close device
Write device
Read device fclose() file_operations:release
Close device
Remove module rmmod module_exit()
À¯Àú¿µ¿ªÀÇ ÇÔ¼ö¿Í ´Ù¸¥ Á¡À̶ó¸é, À¯Àú¿µ¿ªÇÔ¼ö´Â ÀÌ¹Ì Á¤ÀǵǾî ÀÖ´Â ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÇÁö¸¸, Ä¿³Î¿µ¿ª ÇÔ¼öÀÇ °æ¿ì, »ç¿ëÀÚ°¡ Á÷Á¢Á¤ÀÇ ÇØÁà¾ß ÇÑ´Ù´Â Á¡ÀÏ °ÍÀÌ´Ù.

´ÙÀ½Àº ÀÐ°í ¾²±â À§ÇÑ 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/memory 
 
f°¡ Ãâ·ÂµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

º´·Ä Æ÷Æ® µå¶óÀ̹ö ÀÛ¼º

±×·³ ½ÇÁ¦ »ç¿ë°¡´ÉÇÑ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÀÛ¼ºÇØ º¸µµ·Ï ÇϰڴÙ. ¸¸µé µð¹ÙÀ̽º µå¶óÀ̹ö´Â parlelport¶ó°í ¸í¸íÇÒ °ÍÀÌ´Ù.

º´·ÄÆ÷Æ®´Â µðÁöÅÐ Á¤º¸ÀÇ ÀÔÃâ·ÂÀ» À§ÇÑ ÀÏÀ» ÇÏ´Â ÄÄÇ»ÅÍ ÀåÄ¡·Î D-25 connector¿Í 25°³ÀÇ ÇÉÀ» Á¦°øÇÑ´Ù. PC´Â ÀåÄ¡¸¦ °¡¸®Å°´Â ù¹øÂ° ÁÖ¼Ò·Î 0x378À» »ç¿ëÇÑ´Ù. ¾Æ·¡ÀÇ ±×¸²Àº ¿ÜºÎ ÄÁÅÙÆ®Çɰú Á¢±ÙÇÏ´Â ÁÖ¼Ò¸¦ ±â¼úÇϰí ÀÖ´Ù.

parll.png

¸ðµâÃʱâÈ­ Çϱâ

ÀÌÀü¿¡ ´Ù·ç¾ú´ø 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 ÇÔ¼ö´Â ÇØ´ç ÁÖ¼Ò·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àаí À̸¦ ¹öÆÛ¿¡ ´ã¾ÆµÎ´Â ÀÏÀ» ÇÑ´Ù.
À̺¥Æ® Ä¿³Î ÇÔ¼ö
Read data inb
Write data

ÀåÄ¡¿¡ ¾²±â

ÀåÄ¡·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àд ÇÔ¼ö¸¦ ¸¸µé¾úÀ¸´Ï, ÀÌÁ¦ ÀåÄ¡·Î µ¥ÀÌÅ͸¦ ¾²´Â ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â À¯Àú ¿µ¿ªÀÇ µ¥ÀÌÅ͸¦ Àо, ÀåÄ¡°¡ ÀÐÀ» ¼ö ÀÖ´Â µ¥ÀÌÅÍ·Î º¯È¯ÇÑ ÈÄ ¾²´Â ÀÏÀ» ÇÑ´Ù. ÇÔ¼öÀÇ À̸§Àº outb À̸ç, µÎ¹øÂ° ÀÎÀÚ·Î ÁÖ¾îÁø ÁÖ¼Ò ¿µ¿ª¿¡, ù¹øÂ° ÀÎÀÚ·Î ÁÖ¾îÁø µ¥ÀÌÅ͸¦ ¾´´Ù.
À̺¥Æ® Ä¿³Î ÇÔ¼ö
Read data inb
Write data outb

¿ÏÀüÇÑ 'parlelport' µå¶óÀ̹ö

¸ðµâÀ» ÃʱâÈ­ Çϰí, µå¶óÀ̹ö·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àаí, µå¶óÀ̹ö·Î µ¥ÀÌÅ͸¦ ¾²°í, ¸ðµâÀ» Á¦°ÅÇϱâ À§ÇÑ ÄÚµåµé¿¡ ´ëÇØ¼­ ¾Ë¾ÆºÃ´Ù. ÀÌÁ¦ À̵é Äڵ带 Á¶ÇÕÇØ¼­ ¿ÏÀüÇÏ°Ô ÀÛµ¿ÇÏ´Â ÀåÄ¡µå¶óÀ̹ö¸¦ ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.