시스템콜이 등록이 안되는 것 같습니다. 도와주세요 ㅠㅠ
글쓴이: EMJAY♡ / 작성시간: 일, 2008/06/01 - 12:29오후
지금 시스템콜 부분을 책에 있는 실습을 통하여 공부중인데요.
책에 있는대로 시스템 콜 번호 할당해주고, 콜테이블에 등록하고
함수 구현하고, Makefile 수정하고 커널 재컴파일하고
응용프로그램 구현해서 컴파일까지 마쳤는데 (/usr/src/asm/unistd.h 파일에 추가도 했구요)
응용프로그램을 실행해보니 시스템콜 구현부분이 실행이 안되네요.
/var/log/messages 를 확인해봐도 기록이 안남아있구요 ㅠㅠ
제가 보기엔 시스템콜이 등록이 안되서? 그러는거 같은데
왜그런걸까요 ............. ?
리눅스도 다시 깔아봤는데 그대로네요;
다시 리눅스를 깔아야 하는걸까요?
고수님들 도와주세요 ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ
+) 참고하고 있는 책은 한빛미디어의 '리눅스시스템 & 커널기초' 이구요,
Redhat 9.0 에 커널버젼은 2.4.32 입니다.
( 이 책대로 따라가는게 실습결과가 제일 잘나온다고 하셔서 일단 그대로 따라가는 중입니다; )
Forums:
일전에 저도
일전에 저도 시스템콜때문에 애를 먹은적이 있었습니다.
그때 구현했던 방법을 간단히 적었습니다.
조금이나마 참고가 되시면 좋겠네요~~
1. Linux-버젼/kernel 디렉토리에 mysyscall.c라는 파일을 추가합니다.
여기에 처리하려는 시스템콜내용을 작성해줍니다.
2. 다음 Linux-버젼/include/asm-i386/unistd.h파일과 /usr/include/asm/unistd.h파일에 다음의 코드를 추가합니다.
#define __NR_mysyscall 325
325라는것은 시스콜번호인데 현재 2.6.23버젼에서 시스템콜이 324개까지 실현되였으므로 새로 추가한 시스콜번호를 325로 할당해주었습니다.
3. 다음 linuxk-버젼/arch/i386/kernel/ syscall_table.S파일에 다음의 코드를 추가해줍니다.
.long sys_mysyscall /* 325 */
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 mysyscall.o
5. 애플리케이션을 작성합니다.
이때 새로 추가한 시스템콜을 등록하기 위해 lib화일을 만들어줍니다.(mylib.c)
#include
int mysyscall()
{
syscall(__NR_mysyscall, <파라미터들>);
}
다음 새로 추가한 시스콜을 호출하는 애플리케이션을 작성합니다.( mysyscall_app.c)
#include
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파일은 단지 새로 추가한 시스템콜을 등록하는것이므로 이 lib파일을 작성하지 않고 직접 새로 추가한 시스템콜을 호출하려면 다음과 같은 방법으로 하면 됩니다.
syscall(__NR_mysyscall, <파라미터들>)
조금이나마 도움 되시기를....
좋은 하루 되세요!!
좋은 하루 되세요!!
보충
아~ 님이 이용하시는 버젼이 2.4이군요.
2.4에서는 파라미터개수에 따라 syscall함수가
syscall0()
syscall1()
syscall2()
이런 형식으로 되었던것 같습니다. (잘 기억나지 않네요~~)
2.6커널에서부터 syscall이라는 하나의 함수로 통합하였을겁니다.
좋은 하루 되세요!!
좋은 하루 되세요!!
댓글 달기