µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ¸¸µå´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ¿ì¼± ´ëºÎºÐÀÇ ¹®¼¿¡ ³ª¿À´Â °£´ÜÇÑ ¿¹Á¦¸¦
ÀÌ¿ëÇØº¸ÀÚ.
/* 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 ¿É¼ÇÀ» »ç¿ëÇØ ¸µÅ·À» ÇÏÁø ¾Ê¾Æ¾ßÇÑ´Ù.
¿¡·¯ ¾øÀÌ ÄÄÆÄÀÏ µÆÀ¸¸é ´ÙÀ½°ú °°Àº ¸í·ÉÀ¸·Î ¸¸µé¾îÁø µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ µî·ÏÇØº¸ÀÚ.
ȸ鿡 ¹º°¡ Ãâ·ÂµÇ´Â°¡? ¾Æ¹« °Íµµ Ãâ·ÁµÇÁö ¾ÊÀ¸¸é 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¸¦ »ç¿ëÇØ Çϳª·Î ¹¾îÁØ´Ù.