¸®´ª½º Ä¿³Î (2.4) ¸ðµâ ÇÁ·Î±×·¡¹Ö
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

¸®´ª½º Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹Ö - 2.4

¸®´ª½º Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹Ö - 2.4

À± »ó¹è

dreamyun@yahoo.co.kr

교정 과정
교정 0.82003³â 10¿ù 15ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º


1절. ¼Ò°³

1.1절. ÀÌ ¹®¼­¿¡ ´ëÇØ¼­

ÀÌ ¹®¼­´Â The Linux Kernel Module Programming GuideÀ» Âü°íÇßÀ¸¸ç, ¸¹Àº ºÎºÐ ¿ø¹®À» ±×´ë·Î ¹ø¿ªÇÏ¿´´Ù. ±×·¯³ª º»¹®À» ½ÇÁ¦ Å×½ºÆ® Çϸ鼭 ³»¿ëÀÌ ¹ÌÈíÇÑ ºÎºÐÀ» º¸¿ÏÇÏ¿´À¸¸ç, ¸î¸î Ʋ¸° ºÎºÐ¿¡ ´ëÇÑ ¼öÁ¤µµ ÀÌ·ç¾îÁ³´Ù.


1.2절. Ä¿³Î ¸ðµâÀ̶õ ?

Ä¿³Î ¸ðµâ¿¡ ´ëÇØ¼­ ÀÌÇØÇϰí ÇÁ·Î±×·¡¹ÖÀ» Çϱâ À§Çؼ­ ´ç¿¬È÷ ¿©·¯ºÐÀº C¾ð¾î¿Í ¸®´ª½º ½Ã½ºÅÛ¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¦ Çϰí ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ¹®¼­´Â ¸®´ª½º(À¯´Ð½º) ½Ã½ºÅÛ°ú C¿¡ ´ëÇÑ ±âº» ÀÌÇØ¸¦ Çϰí ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ÀÛ¼ºµÉ °ÍÀÌ´Ù.

Ä¿³Î ¸ðµâÀ̶õ Çʿ信 µû¶ó Ä¿³Î¿¡ ·ÎµåÇϰųª ¾ð·Îµå ÇÒ ¼ö Àִ ƯÁ¤ÇÑ ±â´ÉÀ» ¼öÇàÇÏ´Â ÄÚµå(ÇÁ·Î±×·¥)ÀÌ´Ù. ÀÌ·¸°Ô ÇÏ¹Ç·Î½á ½±°Ô Ä¿³ÎÀÇ ±â´ÉÀ» È®ÀåÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó ¿î¿µÃ¼Á¦¸¦ ¸®ºÎÆÃ ÇÏÁö ¾Ê°íµµ ¿øÇÏ´Â ±â´ÉÀ» ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ¸¸µé ¼ö ÀÖ´Ù.

¿¹¸¦ µé¾î¼­ ¾î¶² Çϵå¿þ¾î¸¦ Á¦¾îÇϱâ À§ÇÑ ¹®ÀÚ ÀåÄ¡(device drive)¸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù°í »ý°¢Çغ¸ÀÚ. ¸¸¾à ¸ðµâ±â´ÉÀ» Á¦°øÇÏÁö ¾Ê´Â Ä¿³ÎÀ̶ó¸é Ä¿³ÎÀ» Á÷Á¢¼öÁ¤ÇÏ´Â ¹æ½ÄÀ» µ¿¿øÇؼ­ Ä¿³Î¿¡ ÇÊ¿äÇÑ ±â´ÉÀ» Ãß°¡½ÃÄÑ¾ß ÇÒ °ÍÀÌ´Ù. ÇÁ·Î±×·¥ ÀÚü°¡ ¾î·Á¿öÁö´Â °ÍÀº ¹°·ÐÀÌ°í ±â´ÉÀ» Å×½ºÆ® Çϱâ À§Çؼ­´Â °è¼ÓÀûÀÎ ¸®ºÎÆÃ ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ°Ô µÇ¹Ç·Î °³¹ß±â°£ ¿ª½Ã ±ØÀûÀ¸·Î ´Ã¾î³¯ ¼ö ¹Û¿¡ ¾øÀ» °ÍÀÌ´Ù. ¶ÇÇÑ Ä¿³Î¿¡ ÇÊ¿äÇÑ ±â´ÉÀÌ Ãß°¡µÉ ¶§¸¶´Ù Ä¿³Î¿¡ °è¼ÓÇØ¼­ Äڵ尡 Ãß°¡ µÊÀ¸·Î Ä¿³ÎÀÇ Å©±âµµ ¸Å¿ì Ä¿Áö°Ô µÉ°ÍÀÌ´Ù. »ç¿îµåÄ«µå¸¦ À§ÇÑ ±â´ÉÀ» Ãß°¡Çߴµ¥ ÇØ´ç »ç¿îµåÄ«µå¸¦ °¡ÁöÁö ¾Ê´Â À¯Àúµµ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·² °æ¿ì´Â ±×¾ß¸»·Î ¾µµ¥ ¾ø´Â ÀÚ¿ø³¶ºñ°¡ µÇ´Â ¼ÀÀÌ´Ù. ` Ä¿³Î ¸ðµâ·Î½á ÀÛµ¿Çϵµ·Ï ¸¸µé¾ú´Ù¸é ¾µµ¥¾ø´Â ±â´ÉÀ» ÇÏ´Â ¸ðµâÀº ¾ð·Îµå ½ÃŰ¸é ±×¸¸ÀÌ´Ù.

ÀÌ ¹®¼­´Â ¸®´ª½º Ä¿³Î 2.4¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù.


2절. Ä¿³Î ¸ðµâ ÇÁ·Î±×·¡¹ÖÀÇ ±âº»

2.1절. Ä¿³Î¿¡ ¸ðµâ ÀûÀç½Ã۱â

ÇöÀç Ä¿³Î¿¡¼­ ÀÛµ¿ÁßÀÎ ¸ðµâÀÇ ¸ñ·ÏÀº lsmod ¸í·ÉÀ» ÅëÇØ¼­ È®ÀÎÇÒ ¼ö ÀÖ´Ù.

# lsmod
Module                  Size  Used by    Tainted: P  
via82cxxx_audio        18304   1  (autoclean)
uart401                 6560   0  (autoclean) [via82cxxx_audio]
ac97_codec              9504   0  (autoclean) [via82cxxx_audio]
sound                  59052   0  (autoclean) [via82cxxx_audio uart401]
soundcore               4324   4  (autoclean) [via82cxxx_audio sound]
autofs                 10948   0  (autoclean) (unused)
ne2k-pci                5568   1 
8390                    6736   0  [ne2k-pci]
ipchains               37704   0 
ide-scsi                8192   0 
scsi_mod               95848   1  [ide-scsi]
ide-cd                 27360   0  (autoclean)
cdrom                  28480   0  (autoclean) [ide-cd]
usb-uhci               21764   0  (unused)
usbcore                51744   1  [usb-uhci]
ext3                   61568   4 
			
lsmod´Â /proc/modules ÆÄÀÏÀÇ ³»¿ëÀ» ±×´ë·Î Ãâ·ÂÇÑ´Ù.

±×·³ Ä¿³ÎÀº ÀÌ·¯ÇÑ ¸ðµâÀ» ¾î¶»°Ô ã¾Æ¼­ ÀûÀç½ÃŰ´Â °É±î. Ä¿³ÎÀÌ ¾î¶² ¸ðµâÀ» Æ÷ÇÔÇϰíÀÚ ÇÒ¶§ ÇØ´ç ¸ðµâÀÌ ¾ÆÁ÷ Ä¿³Î¿¡ ÀûÀçµÇ¾î ÀÖÁö ¾Ê´Ù¸é ¸ðµâ µ¥¸ó(daemon)ÀÎ kmod°¡ modprobe¸¦ ½ÇÇà½ÃÄѼ­ ¸ðµâÀ» ÀоîµéÀÌ°Ô µÈ´Ù. À̶§ modprobe´Â ´ÙÀ½Áß ÇϳªÀÇ ¹æ¹ýÀ» ÀÌ¿ëÇØ¼­ Àоîµé¿©¾ßÇÒ ¸ðµâÀ» ã°Ô µÈ´Ù.

  • softdog, ppp¿Í °°Àº ¸ðµâÀ̸§À» Á÷Á¢ ã´Â´Ù.

  • char-major-10-30 °ú °°Àº ÀϹÝÀûÀÎ ½Äº°ÀÚ(generic identifier)¸¦ ÀÌ¿ëÇÑ´Ù.

¸¸¾à modprobe°¡ ½Äº°ÀÚ¸¦ ÀÌ¿ëÇÒ °æ¿ì, ÇØ´ç ½Äº°ÀÚ¿¡ ´ëÇÑ ÁøÂ¥ ¸ðµâÀ̸§À» ¾Ë¾Æ¿Í¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ Á¤º¸´Â /etc/modules.conf¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.

alias char-major-10-30 softdog
			
º°Äª¸ñ·ÏÀ» È®ÀÎÇÔÀ¸·Î½á ½Äº°ÀÚ¸¦ À§Çؼ­ softdog.o¸ðµâÀ» ÀûÀç½ÃÄÑ¾ß µÈ´Ù´Â Á¤º¸¸¦ ¾òÀ» ¼ö ÀְԵȴÙ.

´ÙÀ½ modprobe´Â /lib/modules/version/module.depÆÄÀÏÀ» °Ë»çÇÑ´Ù. ¿©±â¿¡´Â ÇØ´ç¸ðµâÀÌ ½ÇÇàµÇ±âÀ§ÇØ ÇÊ¿äÇÑ ´Ù¸¥ ¸ðµâµé Áï ¸ðµâÀÇÁ¸¼º¿¡ °üÇÑ Á¤º¸µéÀÌ À־ softdog.o¸¦ ÀûÀçÇϱâ À§Çؼ­ ´Ù¸¥ ¸ðµâÀÌ ÇÊ¿äÇÑÁö È®ÀÎÇÏ°í ¹Ì¸® ÀûÀç½ÃŲ´Ù. ÀÌ ÆÄÀÏÀº depmod -a¸í·ÉÀ¸·Î »ý¼º½Ãų ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î msdos.o ¸ðµâÀº fat.o¸ðµâÀÌ ¿ì¼±ÀûÀ¸·Î ÀûÀçµÇ¾î ÀÖ¾î¾ß¸¸ ÇÑ´Ù. modprobe´Â modeule.depÆÄÀÏÀ» ÂüÁ¶Çؼ­ ÀÇÁ¸¼ºÀ» °Ë»çÇÏ°Ô µÈ´Ù.

¸¶Áö¸·À¸·Î modprobe´Â insmod¸¦ ÀÌ¿ëÇØ¼­ ¿øÇÏ´Â ¸ðµâÀ» ÀûÀçÇϱâ À§Çؼ­ ¿ì¼±ÀûÀ¸·Î ÇÊ¿äÇÑ ¸ðµâÀ» ÀûÀç½ÃŰ°Ô µÈ´Ù. insmod´Â /lib/modules/version/À» Á÷Á¢ÂüÁ¶Çؼ­ ¸ðµâÀ» ÀûÀçÇÑ´Ù. ÃÖÁ¾ÀûÀ¸·Î ¿©·¯ºÐÀÌ msdos ¸ðµâÀ» ¿Ã¸®±â¸¦ ¿øÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.

# insmod /lib/modules/2.5.1/kernel/fs/fat/fat.o
# insmod /lib/modules/2.5.1/kernel/fs/msdos/msdos.o
			
±×·¯³ª À§¿Í °°ÀÌ ÇÒ°æ¿ì ¸ðµâ ÀÇÁ¸¼ºÀ» Á÷Á¢ °Ë»çÇØÁà¾ß Çϴµ¥, ÀÌ·² °æ¿ì modprobe¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù.
 
# modprobe -a msdos
			

¸®´ª½º¿¡¼­ »ç¿ëµÇ´Â modprobe, insmod, depmod¿Í °°Àº ÇÁ·Î±×·¥Àº modutils(ȤÀº mod-utils) ÆÐŰÁö¿¡ Æ÷ÇԵȴÙ.

±×·³ /etc/modules.conf¸¦ °£·«ÇÏ°Ô »ìÆìº¸°í À̹øÀåÀ» ³¡¸¶Ä¡µµ·Ï ÇϰڴÙ.

# This file is automatically generated by update-modules

path[misc]=/lib/modules/2.4.?/local
alias eth0 ne2k-pci
alias eth1 ne2k-pci
			
'#'Àº ÁÖ¼®À» À§Çؼ­ »ç¿ëµÇ¸ç °ø¹é¶óÀÎÀº ¹«½ÃµÈ´Ù.

path[misc]´Â misc¸ðµâÀ» ãÀ» °æ·ÎÀÇ ÁöÁ¤À» À§Çؼ­ »ç¿ëµÈ´Ù.

alias ´Â kmode°¡ ½Äº°ÀÚ eth0À» È£Ãâ ÇßÀ» ¶§ ne2k-pci¸¦ È£ÃâÇϵµ·Ï ÇÑ´Ù. alias´Â ²Ï Áß¿äÇÏ°Ô »ç¿ëµÉ ¼ö Àִµ¥ ÇϳªÀÇ ½Ã½ºÅÛ¿¡ µ¿ÀÏÇÑ ÀåÄ¡°¡ 2°³ ÀÌ»ó ºÙ¾î ÀÖÀ»¶§ À̸¦ ½Äº°ÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.


2.2절. Ãʰ£´Ü ¸ðµâÁ¦ÀÛ : Hello World

¾î¶² ¿ª»çÀûÀÎ ÀÌÀ¯°¡ ÀÖ´ÂÁö ¸ð¸£°ÚÁö¸¸ ´ëºÎºÐ ÇÁ·Î±×·¡¹ÖÀÔ¹® À» Çϴµ¥ À־ °¡Àå ¸ÕÀú "Hello World"¸¦ Ãâ·ÂÇÏ´Â Äڵ带 À强ÇÏ´Â µ¥¿¡¼­ ºÎÅÍ ½ÃÀÛÇÑ´Ù. Hello World Ãâ·Â ÄÚµå¿Í °ü·ÃµÈ Àç¹ÌÀÖ´Â ±ÛÀÌ Àִµ¥ Çѹø ÀÐ¾î º¸±â ¹Ù¶õ´Ù. Hello WorldÀÇ º¯Ãµ»ç

¿©±â¿¡¼­µµ "Hello World"¸¦ Ãâ·ÂÇÏ´Â Äڵ带 ¸¸µå´Â °ÍÀ¸·Î ¸ðµâ ÇÁ·Î±×·¡¹ÖÀ¸·ÎÀÇ ¹ß°ÉÀ½À» ³»µóµµ·Ï ÇϰڴÙ. À̰ÍÀº ¸Å¿ì °£´ÜÇÑ ¸ðµâÀε¥, ¾ÆÁ÷ ÄÄÆÄÀÏ ¹æ¹ýÀ» ´Ù·çÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ¸ðµâ ÄÄÆÄÀÏÀº 2.3절¿¡¼­ ´Ù·çµµ·Ï ÇϰڴÙ.

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
    printk("<1>Hello World 1.\n");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_ALERT "Goodbye world 1.\n");
}
			
Ä¿³Î¸ðµâÀº ÃÖ¼ÒÇÑ 2°³ÀÇ ÇÔ¼ö¸¦ °¡Áö°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù. Çϳª´Â init_module()¶ó´Â À̸§ÀÇ ½ÃÀÛ(ÃʱâÈ­)ÇÔ¼ö·Î½á insmod¿¡ ÀÇÇØ¼­ Ä¿³Î·Î ÀûÀçµÉ¶§ È£ÃâµÈ´Ù. ´Ù¸¥ Çϳª´Â cleanup_module()¶ó´Â À̸§ÀÇ Á¾·áÇÔ¼ö·Î½á rmmod¸¦ È£ÃâÇØ¼­ ¸ðµâÀ» »èÁ¦ÇÒ¶§ È£ÃâµÈ´Ù.


2.2.1절. printk()¿¡ ´ëÇØ¼­

ÀϹÝÀûÀ¸·Î printk¸¦ ÀÌ¿ëÇϸé (ÇÔ¼öÀ̸§ÀÇ ¾î°¨ ¶§¹®¿¡) ƯÁ¤ÇÑ ¸Þ½ÃÁö¸¦ Ç¥ÁØÃâ·ÂÇÒ °ÍÀ¸·Î »ý°¢ÇÏ´Â °æ¿ì°¡ ¸¹Àºµ¥ printk´Â À¯Àú¸¦ À§ÇÑ ¾î¶² Ãâ·Âµµ ÇÏÁö ¾Ê´Â´Ù. À̸§°ú´Â ´Þ¸® ·Î±×³ª °æ°í ¸Þ½ÃÁö¸¦ ³²±â±â À§ÇÑ Ä¿³Î·Î±ë ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù.

ÀϹÝÀûÀÎ ·Î±×°ü·Ã ¶óÀ̺귯¸®³ª ÇÔ¼öµéÀÌ ±×·¸µíÀÌ printkµµ ¿ì¼±¼øÀ§(priority)¸¦ °¡Áø´Ù. ¸ðµÎ 8´Ü°èÀÇ ¿ì¼±¼øÀ§¸¦ °¡Áö¸ç <1> KERN_ALERT ¿Í °°Àº ¹æ½ÄÀ¸·Î °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌµé ¿ì¼±¼øÀ§¿¡ ´ëÇÑ ¼±¾ðÁ¤º¸´Â linux/kernel.h¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ¿ì¼±¼øÀ§¸¦ Á¤Çϱ⠱ÍÂú°Å³ª Á¤ÇÒ ¼ö ¾ø´Ù¸é ±âº» ¿ì¼±¼øÀ§ DEFAULT_MESSAGE_LOGLEVELÀ» »ç¿ëÇÏ¸é µÈ´Ù.

¸¸¾à syslogd¿Í klogd°¡ ½ÇÇàÁßÀ̶ó¸é ¸Þ½ÃÁö´Â /var/log/messages¿¡ Ãß°¡ µÈ´Ù. ´ÙÀ½Àº ½ÇÁ¦ ÀúÀåµÈ ·Î±×µéÀÌ´Ù.

Oct  6 01:15:39 localhost kernel: Hello World 1.
Oct  6 01:16:11 localhost kernel: Goodbye world 1.
				


2.3절. Ä¿³Î ¸ðµâ ÄÄÆÄÀÏ Çϱâ

Ä¿³Î ¸ðµâÀ» ÄÄÆÄÀÏÇϱâ À§Çؼ­´Â Ưº°ÇÑ gcc ¿É¼Ç°ú ´õºÒ¾î ¸î°¡Áö °ªµéÀÇ Á¤ÀÇ(symbols define)°¡ ÇÊ¿äÇÏ´Ù. ÀÌÀ¯´Â Ä¿³Î¸ðµâ ÄÄÆÄÀϽà »ç¿ëµÇ´Â Ä¿³Î Çì´õµéÀÌ Ä¿³Î¹öÁ¯¿¡ ¸Å¿ì ÀÇÁ¸ÀûÀÏ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

ÀÌ·¯ÇÑ Á¤ÀÇ´Â gccÀÇ -D¿É¼ÇÀ» ÀÌ¿ëÇϰųª ȤÀº #define ¼±Çàó¸®ÀÚ¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù. À̹ø Àå¿¡¼­´Â Ä¿³ÎÄÄÆÄÀÏÀ» Çϱâ À§Çؼ­ ÇÊ¿äÇÑ ³»¿ëµé¿¡ ´ëÇØ¼­ ´Ù·ê °ÍÀÌ´Ù.

  • -c : Ä¿³Î¸ðµâÀº µ¶¸³ÀûÀ¸·Î ½ÇÇàµÇÁö ¾ÊÀ¸¸ç (mainÇÔ¼ö ÀÚü¸¦ Æ÷ÇÔÇϰí ÀÖÁö ¾Ê´Ù) objectÆÄÀÏ ÇüÅ·ΠĿ³Î¿¡ ¸µÅ©µÇ¾î¼­ ½ÇÇàµÈ´Ù. °á°úÀûÀ¸·Î -c ¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ ¿ÀºêÁ§Æ® ÇüÅ·Π¸¸µé¾î ÁÖ¾î¾ß ÇÑ´Ù.

  • -O2 : Ä¿³ÎÀº inlineÇÔ¼ö¸¦ ¸Å¿ì ¸¹ÀÌ »ç¿ëÇϸç, ±×·± ÀÌÀ¯·Î ¸ðµâÀº ¹Ýµå½Ã ÃÖÀûÈ­(optimization) ¿É¼ÇÀ» »ç¿ëÇØ¼­ ÄÄÆÄÀÏ µÇ¾î¾ß ÇÑ´Ù. ÃÖÀûÈ­ ¿É¼ÇÀ» »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì ¾î¼Àºí·¯ ¸ÅÅ©·ÎµîÀ» »ç¿ëÇϴµ¥ À־ ¹®Á¦°¡ »ý±æ¼ö ÀÖ´Ù. ÀÌ·²°æ¿ì ¸ðµâÀÇ ÀûÁ¦°¡ ½ÇÆÐÇÏ°Ô µÉ°ÍÀÌ´Ù.

  • -D__KERNEL__ : ÀÌ Äڵ尡 À¯Àú ÇÁ·Î¼¼½º°¡ ¾Æ´Ñ Ä¿³Î¸ðµå¿¡¼­ ÀÛµ¿ÇÒ °ÍÀ̶ó´Â°É Ä¿³ÎÇì´õ¿¡ ¾Ë·ÁÁØ´Ù.

  • -W -Wall : ¸ðµâ ÇÁ·Î±×·¥Àº Ä¿³Î¿¡ ¸Å¿ì ¹Î°¨ÇÑ ¿µÇâÀ» ³¢Ä¥ ¼ö ÀÖÀ¸¸ç Ä¿³ÎÀ» ´Ù¿î ½Ãų ¼öµµ ÀÖ´Ù. ±×·¯¹Ç·Î °¡´ÉÇÑÇÑ ¸ðµç Á¾·ùÀÇ °æ°í¸Þ½ÃÁö¸¦ °Ë»çÇØ¾ßÇÒ Çʿ䰡 ÀÖ´Ù. ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé ÄÄÆÄÀÏ·¯°¡ ¹ß»ý½Ãų¼ö ÀÖ´Â ¸ðµç °æ°í¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.

  • -DMODULE : Ä¿³Î¸ðµâ·Î ÀÛ¼ºµÇ´Â ÄÚµå¶ó´Â°É ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù.

À̿ܿ¡µµ ÄÄÆÄÀÏ¿¡ »ç¿ëµÉ Çì´õÆÄÀÏÀ» ã±â À§Çؼ­ -I´ë½Å¿¡ -isystemÀ» »ç¿ëÇϸç "unused varaiable"°ú °°Àº °æ°í ¸Þ½ÃÁöÀÇ Ãâ·ÂÀ» À§Çؼ­ -W -WallÀ» ÀÌ¿ëÇÒ °ÍÀÌ´Ù. -isystemÀº gcc-3.xÀ̻󿡼­ Áö¿øµÇ´Â ¿É¼ÇÀÌ´Ù.

참고: -isystem µµ -I ó·³ Çì´õÆÄÀÏÀÇ °æ·Î ÁöÁ¤À» À§Çؼ­ »ç¿ëµÈ´Ù´Â Á¡¿¡¼­ ºñ½ÁÇÏ´Ù. -IÀÇ °æ¿ì Ç¥ÁØ (Çì´õÆÄÀÏ_½Ã½ºÅÛ °æ·Î¸¦ °Ë»çÇϱâ Àü¿¡ -I·Î ÁöÁ¤µÈ °æ·Î¸¦ ¸ÕÀú °Ë»çÇÏ´Â ¹Ý¸é -isystemÀº °¡Àå ¸¶Áö¸·¿¡ ÁöÁ¤µÈ °æ·Î¿¡ ´ëÇÑ °Ë»ç¸¦ ÇÑ´Ù.

´ÙÀ½Àº Ä¿³Î ¸ðµâÀ» ÄÄÆÄÀÏÇϱâ À§ÇÑ ÀüÇüÀûÀÎ MakefileÀÌ´Ù.

TARGET  := hello
WARN    := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS  := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC      := gcc
	
${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
    rm -rf ${TARGET}.o
			
½±°Ô ÀÌÇØ °¡´ÉÇÒ °ÍÀÌ´Ù. make¸¦ ½ÇÇàÇϸé hello.c¸¦ ÄÄÆÄÀÏÇÏ°í ±×°á°ú Ä¿³Î ¸ðµâ(¿ÀºêÁ§Æ®) ÆÄÀÏÀÎ hello.o¸¦ »ý¼ºÇس½´Ù. »ý¼ºµÈ Ä¿³Î ¸ðµâÀº insmod ./hello.o¸¦ ÅëÇØ¼­ ÀûÀç ÇÒ ¼ö ÀÖ´Ù. À̰ɷΠ´ç½ÅÀº ÃÖÃÊÀÇ Ä¿³Î ¸ðµâÀÛ¼º¿¡ ¼º°øÇß´Ù. ¿¹»ó¿Ü·Î °£´ÜÇÏÁö ¾ÊÀº°¡ ? ÀûÀçµÈ Ä¿³Î¸ðµâÀº rmmod hello·Î Á¦°ÅÇÒ ¼ö ÀÖ´Ù. printk()Ãâ·ÂÀº /var/log/message¿¡ ½×ÀÏ °ÍÀÌ´Ù. È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù.

2.2절¿¡ ÀÖ´Â ¿¹Á¦¸¦ º¸¸é init_module()¿¡¼­ 0À» ¸®ÅÏÇϰí ÀÖ´Ù. ±×·±µ¥ ´Ù¸¥ °ªÀ» ¸®ÅÏÇϵµ·Ï ÇÏ¸é ¾î¶»°Ô µÉ±î ? Áö±ÝÇѹø Å×½ºÆ® ÇØº¸±â ¹Ù¶õ´Ù.


2.4절. Hello World 2

initÇÔ¼ö¿Í cleanupÇÔ¼öÀÇ À̸§ÀÌ ¹Ýµå½Ã init_module()¿Í cleanup_module()·Î ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀº (ºñ·Ï È¥µ¿À» ÁÙ¿©ÁÖ±ä ÇϰÚÁö¸¸) ¿ØÁö ÀÌÄ¡¿¡ ¸ÂÁö ¾Ê´Â°Í °°´Ù.

¸®´ª½º Ä¿³Î 2.4ºÎÅÍ´Â ÀÌµé °íÁ¤µÈ À̸§´ë½Å ´Ù¸¥ À̸§À¸·Î »ç¿ë°¡´ÉÇϸç, À̸¦ À§Çؼ­ module_init()¿Í module_exit()ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

¿¹Á¦ : hello_re.c

#include <linux/module.h>
#include <linux/tty.h>
#include <linux/init.h>
#include <linux/kernel.h>

int hello_init(void)
{
    printk(KERN_ALERT "HELLO, World\n");
    return 0;
}

void hello_exit(void)
{
    printk(KERN_ALERT "bye bye\n");
}

module_init(hello_init);
module_exit(hello_exit);
			


2.5절. Hello World 3 : ¶óÀ̼¾½º¿Í ¸ðµâ¿¡ ´ëÇÑ Á¤º¸

Ä¿³Î¸ðµâÀº ´Ù¸¥ ½Ã½ºÅÛ/À¯ÀúÇÁ·Î±×·¥¿¡ ºñÇØ ¿î¿µÃ¼Á¦¿¡ ´õ¿í¹Î°¨ÇÑ ¿µÇâÀ» ³¢Ä¥ ¼ö ÀÖ´Ù. ±×·±ÀÌÀ¯·Î ÃÖ¼ÒÇÑ Ä¿³Î¸ðµâ¿¡´Â Ä¿³ÎÀÛ¼ºÀÚ¿¡ ´ëÇÑ Á¤º¸°¡ µé¾î°¡µµ·Ï ÀÛ¼ºÇÏ´Â°Ô ÁÁÀ» °ÍÀÌ´Ù.

¸®´ª½º Ä¿³Î 2.4À̻󿡼­ Áö±Ý±îÁö ¿ì¸®°¡ ÀÛ¼ºÇÑ Ä¿³Î ¸ðµâÀ» ÀûÀçÇÏ·Á°í ÇÏ¸é ´ÙÀ½°ú °æ°í ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù.

# insmod ./hello.o
Warning: loading ./hello.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
			

참고: ¶óÀ̼¾½ºÁ¤º¸°ü·Ã °æ°í¸Þ½ÃÁö Ãâ·ÂÀº Ä¿³Î ¿É¼ÇÀ» ¾î¶»°Ô ÁÖ°í ÄÄÆÄÀÏ Çß´À³Ä¿¡ µû¶ó Ãâ·ÂµÇÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ¸î¸î ¹èÆ÷ÆÇÀÇ °æ¿ì °æ°í¸Þ½ÃÁö°¡ Ãâ·ÂµÇÁö ¾ÊÀ» °ÍÀÌ´Ù.

ƯÈ÷ ¸¹Àº °³¹ßÀÚµéÀº ÇØ´ç ¸ðµâÀÌ GPL(ȤÀº ÀÌ¿Í ºñ½ÁÇÑ)°ú °°Àº °ø°³µÈ ¶óÀ̽ºÁ¤Ã¥À» µû¸£´ÂÁö ±×·¸Áö ¾ÊÀºÁö¿¡ ´ëÇØ¼­ ¹Î°¨ÇÒ ¼ö Àִµ¥, MODULE_LICENSE() ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇØ¼­ ¶óÀ̼¾½º¸¦ ¸í½ÃÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¶óÀ̼¾½º¿¡ ´ëÇÑ ¸ÞÄ¿´ÏÁòÀº linux/module.h¿¡ Á¤ÀǵǾî ÀÖ´Ù.

ÀÌ¿Í ºñ½ÁÇÏ°Ô MODULE_DESCRIPTION()°ú MODULE_AUTHOR()¸ÅÅ©·Î¸¦ ÀÌ¿ëÇØ¼­ ¸ðµâÀÇ ¿øÀúÀÛÀÚ¿Í ¸ðµâ¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀ» °çµéÀÏ ¼öµµ ÀÖ´Ù.

ÀÌ·¯ÇÑ ¸ðµç ¸ÅÅ©·Î´Â linux/module.h¿¡ Á¤ÀÇ µÇ¾îÀÖ´Ù. ÀÌµé ¸ÅÅ©·Î °ªµéÀº Ä¿³Î¿¡ ÀÇÇØ¼­ Á÷Á¢ ÀÌ¿ëµÇÁö´Â ¾ÊÁö¸¸ objdump¿Í °°Àº µµ±¸¸¦ ÀÌ¿ëÇÒ¶§ ¸ðµâ¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò´Âµ¥ µµ¿òÀ» ÁØ´Ù.

# objdump -s hello_li.o 
...
 0000 6b65726e 656c5f76 65727369 6f6e3d32  kernel_version=2
 0010 2e342e32 30006c69 63656e73 653d4750  .4.20.license=GP
 0020 4c000000 00000000 00000000 00000000  L...............
 0030 00000000 00000000 00000000 00000000  ................
 0040 61757468 6f723d79 756e6472 65616d20  author=yundream 
 0050 3c79756e 64726561 6d406a6f 696e632e  <yundream@joinc.
 0060 636f2e6b 723e0064 65736372 69707469  co.kr>.descripti
 0070 6f6e3d41 2073696d 706c6520 64726976  on=A simple driv
 0080 65720064 65766963 653d7465 73746465  er.device=testde
 0090 76696365 00                          vice.           
			
´ÙÀ½Àº ÀÌµé ¸ÞÅ©·Î¸¦ Æ÷ÇÔ½ÃŲ ¿¹ÀÌ´Ù.

¿¹Á¦ : hello_li.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#define DRIVER_AUTHOR "yundream <yundream@joinc.co.kr>"
#define DRIVER_DESC   "A simple driver"

int init_hello_3(void);
void cleanup_hello_3(void);


static int init_hello_4(void)
{
   printk("<2>Hello, world 4\n");
   return 0;
}


static void cleanup_hello_4(void)
{
   printk("<2>Goodbye, world 4\n");
}


module_init(init_hello_4);
module_exit(cleanup_hello_4);

MODULE_LICENSE("GPL");

MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_SUPPORTED_DEVICE("testdevice");
			


2.6절. ¸í·ÉÇà ÀÎÀÚÀÇ Ã³¸®

Ä¿³Î ¸ðµâµµ ¸í·ÉÇà ÀÎÀÚ¸¦ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù. ±×·¯³ª ÀϹÝÀûÀ¸·Î ÀÌ¿ëÇÏ´Â argc/argv ±â¹ýÀ» »ç¿ëÇÒ ¼ö´Â ¾ø´Ù.

¸ðµâ·ÎÀÇ ¾Æ±Ô¸ÕÆ® Àü´ÞÀº MODULE_PARM()¸ÅÅ©·Î¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. MODULE_PARM()¸ÅÅ©·Î´Â 2°³ÀÇ ÀÎÀÚ¸¦ °¡Áø´Ù. ù ¹øÂ° ÀÎÀÚ´Â °ªÀÌ ÀúÀåµÉ º¯¼ö¸íÀ̰í, µÎ¹øÂ° ÀÎÀÚ´Â ÀúÀåµÉ µ¥ÀÌÅÍÀÇ Å¸ÀÔÀ» ³ªÅ¸³½´Ù. µ¥ÀÌÅÍ Å¸ÀÔÀº "b" : ¹ÙÀÌÆ®, "h": short int, "i": integer, "l": long int, "s":string(¹®ÀÚ¿­)°¡ ÀÖ´Ù. ¹®ÀÚ¿­Àº char * ŸÀÔÀ̸ç insmod·Î È£ÃâµÉ¶§ ¸Þ¸ð¸®°¡ ÇÒ´çµÈ´Ù. ´ÙÀ½Àº °£´ÜÇÑ È°¿ë¿¹ÀÌ´Ù.

int myint = 3;
char *mystr;

MODULE_PARM (myint, "i");
MODULE_PARM (mystr, "s");
			

¹è¿­µµ Áö¿øµÇ´Âµ¥, '-'¸¦ ÀÌ¿ëÇØ¼­ ¹è¿­ÀÇ ÃÖ¼ÒÅ©±â¿Í ÃÖ´ëÅ©±â¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ÁÖ¾îÁú¼ö ÀÖ´Â ÀÎÀÚÀÇ ÃÖ¼Ò¿Í ÃÖ´ë °¹¼ö¸¦ Á¤ÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù.

int myshortArray[4];
MODULE_PARM(myintArray, "2-4i");
			

ÀÌÁ¦ ½ÇÁ¦ ¸ðµâÀ» ½ÇÇà½ÃŰ¸é¼­ ÀÎÀÚ¸¦ ³Ñ±â´Â ¹æ¹ýÀ» ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ÀÎÀÚ´Â [º¯¼ö¸í]=[°ª]ÀÇ ÇüÅ·Π³Ñ¾î°£´Ù. ¸¸¾à ¸ðµâ ÄÚµå»ó¿¡ MODULE_PARM(myint, "i"); ·Î µÇ¾î ÀÖ´Ù¸é ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ÀÎÀÚ¸¦ ³Ñ±ä´Ù.

# insmod ./hello.o myint=50
			
²Ï³ª µ¶Æ¯ÇÑ ¹æ¹ýÀ¸·Î ³Ñ±â°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.

¹è¿­ÀÇ °æ¿ì¿¡´Â ÀÎÀÚ°¡ ÁöÁ¤ÇÑ ÃÖ´ë/ÃÖ¼ÒÀÇ ¹üÀ§¸¦ ¹þ¾î³¯ °æ¿ì ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ¸ç ¸ðµâÀÌ ÀûÀçµÇÁö ¾Ê´Â´Ù. ÀÏ¹Ý ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ¼öÇàÇÏ´Â argc¸¦ ÅëÇÑ ¾Æ±Ô¸ÕÆ® °¹¼ö °Ë»ç¿Í ºñ½ÁÇÑ ÇüŶó°í º¸¸é µÈ´Ù. ¹è¿­ÀÇ °¢ ¿ä¼Ò´Â ','¸¦ ÅëÇØ¼­ ±¸ºÐµÇ¾î Áø´Ù.

int myarray[4];

MODULE_PARM(myarray, "2-4");
			
¿Í °°ÀÌ µÇ¾î ÀÖ´Ù°í ÇÒ¶§, ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î °ªÀ» ³Ñ±æ ¼ö ÀÖ´Ù.
# insmod ./hello.o myarray=1,4,3
			
´ÙÀ½Àº °£´ÜÇÑ ¿¹Á¦ÄÚµåÀÌ´Ù.

¿¹Á¦ : hello_arg.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("yundream@joinc.co.kr");

static short int myshort = 1;
static int myint = 420;
static long int mylong = 9999;
static char *mystring = "blah";

MODULE_PARM (myshort, "h");
MODULE_PARM (myint, "i");
MODULE_PARM (mylong, "l");
MODULE_PARM (mystring, "s");


static int __init hello_5_init(void)
{
   printk(KERN_ALERT "Hello, world 5\n=============\n");
   printk(KERN_ALERT "myshort is a short integer: %hd\n", myshort);
   printk(KERN_ALERT "myint is an integer: %d\n", myint);
   printk(KERN_ALERT "mylong is a long integer: %ld\n", mylong);
   printk(KERN_ALERT "mystring is a string: %s\n", mystring);
   return 0;
}


static void __exit hello_5_exit(void)
{
   printk(KERN_ALERT "Goodbye, world 5\n");
}


module_init(hello_5_init);
module_exit(hello_5_exit);
			


2.7절. ¸ðµâº° ºÐÇÒ ÄÄÆÄÀÏ

º¸Åë Á¶±ÝÀÌ¶óµµ ±Ô¸ð°¡ ÀÖ´Â ½Ã½ºÅÛ/À¯Àú ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÒ ¶§´Â ¼Ò½ºÀÇ °ü¸®¸¦ À§Çؼ­ ÇÔ¼ö/±â´Éº°·Î ¼Ò½º¸¦ ºÐÇÒÇØ¼­ ÄÄÆÄÀÏÇÑ´Ù.

Ä¿³Î ¸ðµâ¿ª½Ã ÀÌ·¯ÇÑ ºÐÇÒ ÄÄÆÄÀÏÀ» Áö¿øÇϴµ¥, ¾Æ·¡ÀÇ Çü½ÄÀ» µû¶óÁÖ¾î¾ß ÇÑ´Ù.

  1. ¸ðµç ¼Ò½ºÆÄÀÏ È¤Àº Çϳª ÀÌ»óÀÇ ¼Ò½ºÆÄÀÏ¿¡ #define _NO_VERSION__ ÀÌ Æ÷ÇԵǾî ÀÖ¾î¾ß ÇÑ´Ù. ¸ðµâ ÄÄÆÄÀÏÀ» À§Çؼ­ Æ÷ÇÔ½ÃŰ´Â module.h ³»¿¡ Ä¿³Î ¹öÁ¯Á¤º¸°¡ Æ÷ÇԵǾî ÀÖÀ¸¸ç ÀÌ Á¤º¸´Â ¸ðµâ¿¡ Àü¿ªÀûÀ¸·Î »ç¿ëµÇ¹Ç·Î _NO_VERSION__ÀÇ »ç¿ëÀº ²Ï³ª Áß¿äÇØÁø´Ù. ¸¸¾à¿¡ version.h¸¦ Á÷Á¢ Æ÷ÇÔ½ÃÄÑ¾ß µÇ´Â °æ¿ì°¡ »ý±ä´Ù¸é _NO_VERSION__À» Á¤ÀÇÇϱ⠹ٶõ´Ù. module.h¿¡´Â ÀÌ°Ô Á¤ÀǵǾî ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù.

  2. ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î ÄÄÆÄÀÏÇÑ´Ù.

  3. ¸¸µé¾îÁø ¿©·¯°³ÀÇ ¿ÀºêÁ§Æ®ÆÄÀÏÀ» Çϳª·Î ¸¸µé¾î Áà¾ß ÇÑ´Ù. x86ÇÏ¿¡¼­´Â d -m elf_i386 -r -o <module name.o> <1st src file.o> <2nd src file.o>

´ÙÀ½Àº ¸ðµâºÐÇÒ ¹æ½ÄÀ¸·Î ÀÛ¼ºµÈ Ä¿³Î ¸ðµâ ¿¹Á¦µéÀÌ´Ù.

¿¹Á¦ : start.c

#include <linux/kernel.h>       /* We're doing kernel work */
#include <linux/module.h>       /* Specifically, a module */

int init_module(void)
{
  printk("Hello, world - this is the kernel speaking\n");
  return 0;
}
			

¿¹Á¦ : stop.c

#if defined(CONFIG_MODVERSIONS) && ! defined(MODVERSIONS)
   #include <linux/modversions.h> /* Will be explained later */
   #define MODVERSIONS
#endif        
#include <linux/kernel.h>  /* We're doing kernel work */
#include <linux/module.h>  /* Specifically, a module  */
#define __NO_VERSION__     /* It's not THE file of the kernel module */
#include <linux/version.h> /* Not included by module.h because of
	                                      __NO_VERSION__ */
	
void cleanup_module()
{
   printk("<1>Short is the life of a kernel module\n");
}
			

´ÙÀ½Àº ÄÄÆÄÀÏÀ» À§ÇÑ MakefileÀÌ´Ù.

CC=gcc
MODCFLAGS := -O -Wall -DMODULE -D__KERNEL__
hello.o:    start.o stop.o
	ld -m elf_i386 -r -o hello.o start.o stop.o

start.o: start.c
	${CC} ${MODCFLAGS} -c start.c

stop.o: stop.c
	${CC} ${MODCFLAGS} -c stop.c
			

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.