@ 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
(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