Àüü¸ñ·Ï (195)
|
Àüü¸ñ·Ï (195)
|
System call Àº Å©°Ô ¼¼°¡Áö·Î ³ª´¶´Ù.
System call ÇÔ¼ö ±¸Çö. System call ¹øÈ£ ÇÒ´ç. User application ±¸Çö.
/Ä¿³Î¼Ò½º/kernel µð·ºÅ丮¿¡ system callÀ» ±¸ÇöÇÑ´Ù. /* Ä¿³Î¼Ò½º°¡ ÂüÁ¶ÇÏ´Â Çì´õÆÄÀÏÀÇ °æ·Î´Â ´ÙÀ½°ú °°´Ù */ /* user application : /usr/include/*.h kernel application(system call, module, device driver) : /KERNEL_SRC/include/linux/*.h> */
eros2.c
#include <linux/kernel.h> #include <linux/errno.h>
asmlinkage void sys_eros2(int in) // ¹Ýµå½Ã sys_·Î ½ÃÀÛÇØ¾ßÇÑ´Ù. // typeÀº ¾î¼ÀÄÚµå¿Í ¿¬µ¿µÈ´Ù°í ÇØ¼ asmlinkage¶ó°í ¾´´Ù. // ¸Å°³º¯¼ö´Â ÃÖ´ë 5°³ ±îÁö¹Û¿¡ Áö¿øÀ» ÇÏÁö ¾Ê´Â´Ù. { int years; years = in; printk("\nEROS System Call.........."); printk("\tYou are \'%d\' years......."); }
À§ÀÇ ¼Ò½º°¡ Ä¿³Î ¿ÀºêÁ§Æ®¿¡ Æ÷ÇÔÀÌ µÇ¾î¾ß ÇÑ´Ù. ±×·¯¹Ç·Î °°Àº µð·ºÅ丮¿¡ ÀÖ´Â Makefile¿¡´Ù°¡ eros2.c¶ó´Â ÆÄÀÏÀÌ ÀÖÀ½À» ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù.
1. obj-y = ÀÌ ºÎºÐ¿¡ eros2.o¸¦ Ãß°¡¸¦ ÇØÁ־ µÇ°í. 2. obj-$(CONFIG_EROS2_SYSCALL) += eros2.o¸¦ Ãß°¡ÇØ Á־ µÈ´Ù. ±×·²°æ¿ì. /Ä¿³Î¼Ò½º/arch/armÀ¸·Î À̵¿. config.inÆÄÀÏÀ» ¼öÁ¤ÇÑ´Ù. 'General setup'ºÎºÐÀÇ ¹Ù·Î ¹ØÁÙ¿¡ ¾Æ·¡ÀÇ Äڵ带 »ðÀÔÇÑ´Ù. bool 'EROS2 System Call Support' CONFIG_EROS2_SYSCALL
ÀÌÁ¦ ¹øÈ£¸¦ ÇÒ´çÇÏ´Â ºÎºÐÀ¸·Î °¡º¸ÀÚ. /Ä¿³Î¼Ò½º/include/asm-arm/unistd.h¸¦ º¸¸é ¿©·¯°¡ÁöµéÀÌ µé¾îÀִµ¥.. #define __NR_SYSCALL_BASE 0x900000 À̰ÍÀº º£À̽º ¾îµå·¹½º ÀÌ´Ù. #define __NR_openÀº À§¿¡°Í +5 ÀÌ´Ù... ±×¸®°í Ãß°¡ÇØ ÁÖ¾î¾ß ÇÏ´Â ½Ã½ºÅÛÄÝÀº Ç×»ó ¸Ç ¸¶Áö¸·ºÎºÐ¿¡ Àû¾îÁÖ¾î¾ß ÇÑ´Ù.
#define __NR_eros2 (__NR_SYSCALL_BASE+ 226) // sys_¸¦ »« ÇÔ¼öÀ̸§À» Àû°í.
ÀÌÁ¦ ¸¸µç ½Ã½ºÅÛÄÝÀ» È£ÃâÇØ ÁÖ´Â ºÎºÐÀÌ ÀÖ¾î¾ß ÇÑ´Ù. /Ä¿³Î¼Ò½º/arch/arm/kernel/calls.S ÀÌ ºÎºÐÀ» ¼öÁ¤ÇÑ´Ù. ¿ª½Ã Á¦ÀÏ ¾Æ·§ºÎºÐ¿¡ ¿ì¸®°¡ ¸¸µç °ÍÀ» Ãß°¡ÇÑ´Ù. .long SYMBOL_NAME(sys_eros2)¸¦ Ãß°¡ÇÑ´Ù.
ÀÌÁ¦ Ä¿³ÎÀ» ÄÄÆÄÀÏÇÏ´Â Àϸ¸ ³²¾Ò´Ù. /Ä¿³Î¼Ò½º µð·ºÅ丮·Î À̵¿. make menuconfig General setupºÎºÐÀ¸·Î µé¾î°¡º¸¸é ù¹øÂ° ºÎºÐ¿¡ EROS2 System Call Suppert ºÎºÐÀ» ¼±ÅÃÀ» ÇØÁÖ¸é µÈ´Ù. ÀÌ°É Ãß°¡ ÇØ ÁÖ¸é eros2.oÆÄÀÏÀÌ Ä¿³Î¼Ò½º¿¡ Ãß°¡°¡ µÉ °ÍÀÌ´Ù. make dep make zImage cp arch/arm/zImage /tftpboot º¸µå¿¡ zImage¸¦ ³Ö¾îÁØ´Ù.
ÀÌÁ¦ ¸¶Áö¸·À¸·Î applicationÀ» ±¸ÇöÇØ ÁÖ´Â ºÎºÐ¸¸ ³²¾Ò´Ù.
#include <stdio.h> #include <linux/unistd.h>
_syscall1(void, eros2, int, in); /* user application : open() -> library : open() ÇÏÁö¸¸ ¿ì¸®°¡ ¸¸µç eros2´Â ÀÌ ºÎºÐÀÌ ¾ø´Ù. ¶óÀ̺귯¸®¿¡ ¾ø´Ù. -> s/w interrupt -> system call : sys_open() ±×·¸±â ¶§¹®¿¡ À§¿Í°°ÀÌ ¼±¾ðÀ» ÇØ ÁÖ¾î¾ß¸¸ ÇÑ´Ù. _syscall0(), _syscall1(), _syscall2(), _syscall3(), _syscall4() ±× ¾È¿¡ µé¾î°¡´Â ¸Å°³º¯¼ö´Â ÇÔ¼öÀ̸§°ú ÇØ´ç ÇÔ¼öÀÇ Å¸ÀÔÀÌ µé¾î°¡°Ô µÈ´Ù. Áï void´Â eros2ÀÇ Å¸ÀÔ, eros2´Â ÇÔ¼öÀ̸§, int´Â ¸Å°³º¯¼öÀÇ Å¸ÀÔ, inÀº ¸Å°³º¯¼ö */
int main() { int my_years; printf("\nInput Your year"); scanf("%d", &my_years);
eros2(my_years);
return 0; }
À̰ÍÀ» ÄÄÆÄÀÏ ÇÑ ÈÄ. º¸µå¿¡ ¿Ã·Á ½ÇÇàÇØº¸ÀÚ.. ¤¾¤¾
|