½Ã½ºÅÛ ÄÝÀ» Ãß°¡Çغ¸ÀÚ. ¿ì¼± »õ·Î¿î ½Ã½ºÅÛ ÄÝÀÌ µé¾îÀÖ´Â ÆÄÀÏÀ» ¸¸µéÀÚ($TOPDIR)/kernel/mysyscall.c
/* $(TOPDIR)/kernel/mysyscall.c */ #include <linux/linkage.h> asmlinkage int sys_mysyscall() { printk("My First System Call.\n"); } |
$(TOPDIR)/include/asm/unistd.h¿¡ »õ·Î¿î ½Ã½ºÅÛ ÄÝÀ» À§ÇÑ ¹øÈ£¸¦ Ãß°¡ÇÑ´Ù.
... #define __NR_vfork 190 #define __NR_mysyscall 191 |
$(TOPDIR)/i386/kernel/entry.S¿¡ ÀÖ´Â ½Ã½ºÅÛ ÄÝ Å×ÀÌºí¿¡ µî·ÏÇÑ´Ù.
ENTRY(sys_call_table) ... .long SYSBOL_NAME(sys_mysyscall) .rept NR_syscalls-191 |
Ä¿³ÎÀ» ÄÄÆÄÀÏÇϴµ¥ À§¿¡¼ ¸¸µç mysyscall.c¸¦ Makefile¿¡ µî·ÏÇØ ÁØ´Ù. °£´ÜÈ÷ 'O_OBJS='À̶õ ÁÙ¿¡ mysyscall.o¶ó°í Ãß°¡ÇØÁÖ¸é µÈ´Ù.
Ä¿³Î ÄÄÆÄÀÏÀÌ ³¡³ª¸é »õ·Î¿î Ä¿³ÎÀ» ¼³Ä¡Çϰí ÀçºÎÆÃÇÑ ´ÙÀ½ ¾Æ·¡¿Í °°Àº Å×½ºÆ® ÇÁ·Î±×·¥À» ¸¸µé¾î ½ÇÇàÇØ º¸ÀÚ.
/* test.c */ #include <linux/unistd.h> _syscall0(int, mysyscall); int main() { int i; i = mysyscall(); return i; } |
Å×½ºÆ® ÇÁ·Î±×·¥À» ½ÇÇàÇßÀ» ¶§ ȸ鿡 'My First System Call'À̶ó°í Ãâ·ÁµÇ¸é ´ÙÇàÀε¥ ¾Æ¹«·± Ãâ·Âµµ ¾ø´Ù¸é dmesg¸¦ »ç¿ëÇØ Ä¿³Î Ãâ·ÂÀ» È®ÀÎÇØ º¸ÀÚ. Á¦ÀÏ ³¡¿¡ ¹®ÀåÀÌ Á¦´ë·Î ÂïÇû´Â°¡?