Monday, April 20, 2015

System Call

@ System Call

(1) linux/arm/kernel/calls.S 수정
    -> 아래와 같이 new system call 선언 추가

...
CALL(sys_timerfd)    /* 350 */
CALL(sys_eventfd)
CALL(sys_fallocate)
CALL(sys_mycall)     /* 353, new system call */
...

(2) linux/kernel/mycall.c 생성
    -> 아래와 같이 mycall.c 작성

"mycall.c"
#include <linux/kernel.h>

/* asmlinkage는 assembly어(calls.S)와 연결하겠다는 의미의 keyword임 */
/* 함수명 sys_mycall은 calls.S의 CALL(sys_mycall) 과 동일해야 함 */
asmlinkage int sys_mycall(void)
{
printk("Hello, Kernel!\n");
return 2015;
}

(3) linux/kernel/Makefile 수정
    -> obj-y 에 mycall.o 추가
obj-y     = sched.o fork.o exec_domain.o panic.o printk.o profile.o \
            exit.o itimer.o time.o softirq.o resource.o \
            sysctl.o capability.o ptrace.o timer.o user.o user_namespace.o \
            signal.o sys.o kmod.o workqueue.o pid.o \
            rcupdate.o extable.o params.o posix-timers.o \
            kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \
            hrtimer.o rwsem.o latency.o nsproxy.o srcu.o \
            utsname.o notifier.o \
            mycall.o

(4) linux/ 디렉터리에서 make zImage 수행
# cd linux-2.6.24-el2440-0504-final
# make zImage

(5) 새로운 kernel image로 Target Board 부팅
    -> tftp를 이용하여 새로운 kernel로 부팅

(6) Host PC에서 새로운 system call을 이용하는 application 작성
"myapp.c"
#include <stdio.h>

int main(void)
{
    /* calls.S에 추가한 index No. 가 사용됨 */
int ret = syscall(353);
printf(" ret = %d\n", ret);
    return 0;
}

(7) arm-linux-gnu-gcc를 가지고 cross-compile 수행
# arm-linux-gnu-gcc myapp.c

(8) nfs를 통해 a.out을 Target Board에서 실행
$ mount -t nfs 192.168.100.2:/tftpboot /mnt/nfs
$ cd /mnt/nfs
$ ls
a.out
$ ./a.out
Hello, Kernel!
ret = 2015

No comments:

Post a Comment