6.2. »ùÇà µð¹ÙÀ̽º µå¶óÀ̹ö

µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ¸¸µå´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ¿ì¼± ´ëºÎºÐÀÇ ¹®¼­¿¡ ³ª¿À´Â °£´ÜÇÑ ¿¹Á¦¸¦ ÀÌ¿ëÇØº¸ÀÚ.

/* hello.c */
(1)
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif

(2)
#define __NO_VERSION__
#include <linux/module.h>
#include <linux/version.h>
#include <linux/fs.h>

(3)
struct file_operations Fops = {
	NULL,	/* owener */
	NULL,	/* llseek */
	NULL,	/* read */
	NULL,	/* write */
	NULL,	/* readdir */
	NULL,	/* poll */
	NULL,	/* ioctl */
	NULL,	/* mmap */
	NULL,	/* open */
	NULL,	/* flush */
	NULL,	/* release */
	NULL,	/* fsync */
	NULL,	/* lock */
	NULL,	/* readv */
	NULL,	/* writev */
	NULL,	/* sendpage */	
	NULL	/* get_unmapped_area */
};

(4)
int init_module()
{
	if (register_chrdev(213, "hello", &Fops) < 0)
		return -EIO;

	printk("hello.o start\n");

	return 0;
}

(5)
void cleanup_module()
{
	unregister_chrdev(213, "hello");
	printk("hello.o end\n");
}

ÄÄÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

gcc -o hello.o -c -D__KERNEL__ -DMODULE -O -Wall -I/usr/include hello.c

ÄÄÆÄÀÏ ÇÒ ¶§ ÄÄÆÄÀÏ·¯¿¡°Ô Ä¿³Î¿¡ ÇØ´çÇÏ´Â ÇÁ·Î±×·¥ÀÓ°ú ÀÌ °ÍÀÌ MODULE ÀÓÀ» ¾Ë·ÁÁØ´Ù. ÀÏ¹Ý ÀûÀÎ ÇÁ·Î±×·¥°ú´Â ´Þ¸® -c ¿É¼ÇÀ» »ç¿ëÇØ ¸µÅ·À» ÇÏÁø ¾Ê¾Æ¾ßÇÑ´Ù.

¿¡·¯ ¾øÀÌ ÄÄÆÄÀÏ µÆÀ¸¸é ´ÙÀ½°ú °°Àº ¸í·ÉÀ¸·Î ¸¸µé¾îÁø µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ µî·ÏÇØº¸ÀÚ.

insmod hello.o

È­¸é¿¡ ¹º°¡ Ãâ·ÂµÇ´Â°¡? ¾Æ¹« °Íµµ Ãâ·ÁµÇÁö ¾ÊÀ¸¸é dmesg ¸í·ÉÀ» »ç¿ëÇØ Ä¿³Î¿¡¼­ »Ñ¸° ¸Þ½ÃÁöÀÇ ¸¶Áö¸·¿¡ 'hello.o start'°¡ ÂïÇû´ÂÁö È®ÀÎÇÑ´Ù. ¶Ç lsmod ¸í·ÉÀ¸·Î Á¤»óÀûÀ¸·Î hello.o°¡ µî·ÏµÆ´ÀÁö È®ÀÎÇØ º¸ÀÚ. ¾Æ·¡ °ÍÀº ÇÊÀÚÀÇ ¸®´ª½º ½Ã½ºÅÛ¿¡ ¿Ã¶ó°£ ¸ðµâµéÀ» º»°ÍÀÌ´Ù. Á¦ÀÏ À§¿¡ hello.o°¡ µî·ÏµÈ °ÍÀÌ º¸ÀÏ °ÍÀÌ´Ù. ºñ·Ï ¾Æ¹« °Íµµ »ç¿ëÇÏÁö ¾Ê´Â´Ù°í ³ª¿Í ÀÖÁö¸¸ óÀ½ ¸¸µé¾îº» µð¹ÙÀ̽º µå¶óÀ̹ö°¡ µî·ÏµÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

Module                  Size  Used by
hello                    592   0  (unused)
smbfs                  31376   4  (autoclean)
sd_mod                 10640   2  (autoclean)
vfat                    9520   1  (autoclean)
fat                    29696   0  (autoclean) [vfat]
sr_mod                 12176   0  (autoclean)
tuner                   8176   0  (autoclean) (unused)
i2c-core               13024   0  (autoclean) [tuner]
vmnet                  17984   6 
parport_pc             19648   0  (unused)
parport                14176   0  [parport_pc]
vmmon                  18784   0  (unused)
3c59x                  24960   1 
ide-scsi                7648   0 
ide-cd                 26656   0 
cdrom                  29056   0  [sr_mod ide-cd]
md                     44224   0  (unused)
snd-pcm-oss            35792   0  (unused)
snd-mixer-oss           8528   1  [snd-pcm-oss]
snd-card-fm801          7296   1 
snd-pcm                47744   0  [snd-pcm-oss snd-card-fm801]
snd-mpu401-uart         2656   0  [snd-card-fm801]
snd-rawmidi            11968   0  [snd-mpu401-uart]
snd-ac97-codec         22832   0  [snd-card-fm801]
snd-opl3                5264   0  [snd-card-fm801]
snd-timer               9584   0  [snd-pcm snd-opl3]
snd-hwdep               3376   0  [snd-opl3]
snd-seq-device          3744   0  [snd-rawmidi snd-opl3]
snd                    23632   0  [snd-pcm-oss snd-mixer-oss snd-card-fm801 snd-pcm snd-mpu401-uart snd-rawmidi snd-ac97-codec snd-opl3 snd-timer snd-hwdep snd-seq-device]
hid                    19152   0  (unused)
input                   3360   0  [hid]
usb-storage            26400   1 
scsi_mod               88400   4  [sd_mod sr_mod ide-scsi usb-storage]
usb-uhci               21408   0  (unused)
usbcore                49632   1  [hid usb-storage usb-uhci]
rtc                     5600   0  (autoclean)

À̾î 'rmmod hello'¶õ ¸í·ÉÀ» ½ÇÇàÇØ º¸ÀÚ. insmod ¶§¿Í ¸¶Âù°¡Áö·Î È­¸é¿¡ ¾Æ¹« °Íµµ Ãâ·ÂµÇÁö ¾ÊÀ¸¸é dmesg¸¦ »ç¿ëÇØ ¶Ç È®ÀÎÇØ º¸ÀÚ. 'hello.o end'¶õ ¸»ÀÌ Ãâ·ÂµÆ´Â°¡? À̾î lsmod¸¦ »ç¿ëÇØ hello.o°¡ ÇØÁ¦µÆ´ÂÁö È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù.

hello.c¸¦ °£´ÜÇÏ°Ô ºÐ¼®ÇØ º¸ÀÚ.

(1)
¸ðµâ·Î ¸¸µé¾îÁö´Â µð¹ÙÀ̽º µå¶óÀ̹ö´Â __KERNEL__°ú MODULEÀÌ ¹Ýµå½Ã Á¤ÀǵǾ߸¸ ÇÑ´Ù.
(2)
ÇÊ¿äÇÑ Çì´õ¸¦ ÀÐ¾î µéÀδÙ.
(3)
file_operations ¶ó´Â ±¸Á¶Ã¼·Î ¸ðµç ¸ðµâ¿£ ¹Ýµå½Ã Á¸ÀçÇØ¾ßÇÑ´Ù. hello.c´Â ¾Æ¹« µ¿ÀÛµµ ÇÏÁö ¾Ê±â ¶§¹®¿¡ ¿©±â¿¡ ¾Æ¹« °Íµµ ä¿ö ³ÖÁö ¾Ê¾ÒÁö¸¸ ´Ù¸¥ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ¸¸µé ¶© ¾Ë¸Â´Â Ç׸ñÀ» ä¿ö ³Ö¾î µ¿ÀÛ Çϵµ·Ï ÇØÁà¾ßÇÑ´Ù.
(4)
init_module()Àº insmod ¸í·É µîÀ» ÀÌ¿ëÇØ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ Ä¿³Î¿¡ µî·ÏÇÒ ¶§ ¹«Á¶°Ç óÀ½ ½ÇÇàµÇ´Â ÇÔ¼ö´Ù. ´Ù½Ã ¸»ÇØ ¸ðµç ¸ðµâ¿£ init_module()°ú cleanup_module()ÀÌ Á¸Àç ÇØ¾ßÇÑ´Ù. º¸ÅëÀº init_module()¿¡¼­ µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ÁÖ/ºÎ ¹øÈ£¸¦ »ç¿ëÇØ µî·ÏÇÏ´Â ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù.
(5)
cleanup_module()Àº ¸ðµâÀ» Á¦°ÅÇÒ ¶§ Ä¿³Î¿¡ ÀÇÇØ ¹«Á¶°Ç ºÒ¸®´Â ÇÔ¼ö·Î init_module()°ú´Â ¹Ý´ë·Îµî·ÏµÈ ¸ðµâÀ» ÇØÁ¦ÇÏ´Â ÇÔ¼ö¸¦ ºÎ¸¥´Ù.

¸¸¾à À§ÀÇ ¿¹Á¦¸¦ X-window »ó¿¡¼­ insmod/rmmod ÇÑ´Ù¸é È­¸é¿¡ ¾Æ¹« °Íµµ ³ª¿ÀÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ´Â printkÀÇ Ãâ·ÂÀÌ °¡»ó Å͹̳Π7¹ø¿¡ Ãâ·ÂµÇ±â ¶§¹®ÀÌ´Ù. ±×·¯¹Ç·Î xterm¿¡ ¿É¼ÇÀ» ÁÖÁö ¾Ê°í ±×³É ¿¬ â¿£ Ãâ·ÂµÇÁö ¾ÊÀ¸¹Ç·Î demsg¸¦ »ç¿ëÇØ È®ÀÎÇØ¾ßÇÑ´Ù. ´ë½Å xterm -C·Î ¿¬ xterm¿¡¼± ¹Ù·Î È®ÀÎÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù.

¿¹Á¦´Â ±× Å©±â°¡ À۱⠶§¹®¿¡ ÇϳªÀÇ ÆÄÀÏ¿¡ ¸ðµÎ µé¾î°¡Áö¸¸ ÀϹÝÀûÀÎ °æ¿ì ÇѰ³ÀÇ ÆÄÀÏ¿¡ ¸ðµâ ÀüüÀÇ ³»¿ëÀÌ µé¾î°¡Áö ¾ÊÀ» °æ¿ì¿£ ¼Ò½º ÄÚµå ¿©·¯°³¿¡ ³ª´² ¾²°Ô µÈ´Ù. ÀÌ·± °æ¿ì¿£ °¢°¢ÀÇ ÆÄÀÏ¿¡ ¸ðµâ¿¡ ÇÊ¿äÇÑ Á¤ÀǸ¦ Çϰí ÄÄÆÄÀÏ ÈÄ ¸µÄ¿¸¦ »ç¿ëÇØ ÇÕÃÄÁÖ¸é µÈ´Ù.

gcc -D__KERNEL__ -DMODULE -Wall -O -c -o start.o start.c
gcc -D__KERNEL__ -DMODULE -Wall -O -c -o stop.o stop.c
ld -m elf_i386 -r -o hello.o start.o stop.o 

start.c¿¡ init_module()ÀÌ µé¾îÀÖ°í stop.c¿¡ cleanup_module()ÀÌ µé¾îÀÖ´Ù¸é °¢°¢À» ÄÄÆÄÀÏ ÇÑ ÈÄ ld¸¦ »ç¿ëÇØ Çϳª·Î ¹­¾îÁØ´Ù.