µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ ¸¸µå´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ¿ì¼± ´ëºÎºÐÀÇ ¹®¼¿¡ ³ª¿À´Â °£´ÜÇÑ ¿¹Á¦¸¦ ÀÌ¿ëÇØº¸ÀÚ.
/* 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¸¦ °£´ÜÇÏ°Ô ºÐ¼®ÇØ º¸ÀÚ.
¸¸¾à À§ÀÇ ¿¹Á¦¸¦ 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¸¦ »ç¿ëÇØ Çϳª·Î ¹¾îÁØ´Ù.