커널에 시스템콜 추가하는 방법을 간단히 소개합니다. 참고하세요! 님들께 조금이나마 도움되기를 ~~

토끼아빠의 이미지

일전에 저도 시스템콜때문에 애를 먹은적이 있었습니다.
그때 구현했던 방법을 간단히 적었습니다.
여러 님들께 조금이나마 참고가 되면 좋겠네요~~

1. Linux-버젼/kernel 디렉토리에 mysyscall.c라는 파일을 추가합니다.
여기에 처리하려는 시스템콜내용을 작성해줍니다.
2. 다음 Linux-버젼/include/asm-i386/unistd.h파일과 /usr/include/asm/unistd.h파일에 다음의 코드를 추가합니다.
<span>#define __NR_mysyscall    325</span>
325라는것은 시스콜번호인데 현재 2.6.23버젼에서 시스템콜이 324개까지 실현되였으므로 새로 추가한 시스콜번호를 325로 할당해주었습니다.
3. 다음 linuxk-버젼/arch/i386/kernel/ syscall_table.S파일에 다음의 코드를 추가해줍니다.
<span>.long sys_mysyscall               /* 325 */</span>
4. 마지막으로 linuxk-버젼/kernel/Makefile에 다음의 코드를 추가해줍니다.

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 die_notifier.o \
	    utsname.o <span><span>mysyscall.o</span></span>

5. 애플리케이션을 작성합니다.
이때 새로 추가한 시스템콜을 등록하기 위해 lib화일을 만들어줍니다.(mylib.c)
#include <linux/unistd.h>
 
int mysyscall()
{
	syscall(__NR_mysyscall, <파라미터들>);
}

다음 새로 추가한 시스콜을 호출하는 애플리케이션을 작성합니다.( mysyscall_app.c)
#include <linux/unistd.h>
int main()
{
…
mysyscall();
…
}

컴파일지령은 다음과 같다.
gcc –c mylib.c
ar –r lib_mylib.a mylib.o
gcc –o mysyscall_app mysyscall_app.c –L./ -l_mylib
./mysyscall_app

우의 방법은 제가 테스팅해본것이니 그대로 이용해도 별문제가 없으리라 봅니다.
우의 lib파일은 단지 새로 추가한 시스템콜을 등록하는것이므로 이 lib파일을 작성하지 않고 직접 새로 추가한 시스템콜을 호출하려면 다음과 같은 방법으로 하면 됩니다.
syscall(__NR_mysyscall, <파라미터들>)
2.4커널까지는 파라미터개수에 따라
syscall0(시스템콜번호)
syscall1(시스템콜번호)
syscall2(시스템콜번호)
이런 형식으로 되었습니다.

조금이나마 도움 되시기를....

좋은 하루 되세요!!

go4real의 이미지

많음 도움 됐습니다
감사해요~^^

토끼아빠의 이미지

님께 조금이나마 도움이 되었다니 저도 정말 기쁘네요~~

좋은 하루 되세요!!

좋은 하루 되세요!!