커널에 시스템콜 추가하는 방법을 간단히 소개합니다. 참고하세요! 님들께 조금이나마 도움되기를 ~~
일전에 저도 시스템콜때문에 애를 먹은적이 있었습니다.
그때 구현했던 방법을 간단히 적었습니다.
여러 님들께 조금이나마 참고가 되면 좋겠네요~~
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(시스템콜번호)
이런 형식으로 되었습니다.
조금이나마 도움 되시기를....
좋은 하루 되세요!!
잘되네요~
많음 도움 됐습니다
감사해요~^^
님께 조금이나마
님께 조금이나마 도움이 되었다니 저도 정말 기쁘네요~~
좋은 하루 되세요!!
좋은 하루 되세요!!