¸ñ·Ï¿­±â Àüü¸ñ·Ï (195)
³ª¸¸ÀÇ System call ¸¸µé±â. UNIX/LINUX

2006/08/13 23:20

http://blog.naver.com/bisiri/10007305510

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;

}

 

À̰ÍÀ» ÄÄÆÄÀÏ ÇÑ ÈÄ. º¸µå¿¡ ¿Ã·Á ½ÇÇàÇØº¸ÀÚ.. ¤¾¤¾

 

 

ÀÌ Æ÷½ºÆ®¸¦..

µ¡±Û ¾²±â ¿«ÀÎ±Û ¾²±â