시스템콜 추가 문제2 ㅜ.ㅜ
codebank님께서 답변해주신 방법으로 어제 문제를 해결하였습니다.
이번에 문제는... 그 아래에 또 다른 시스템콜을 추가하였을때의 문제입니다.
1. include/asm-i386/unistd.h 파일에 __NR_newsyscall 추가
코드:
#define __NR_newsyscall 259 #define __NR_newsyscall2 260
2. arch/i386/kernel/entry.S 에 sys_newsyscall 추가
코드:
.long SYMBOL_NAME(sys_newsyscall) .long SYMBOL_NAME(sys_newsyscall2) .rept NR_syscalls-(.-sys_call_table)/4 << 이부분이 이해가 안되네요. 책에는 .rept NR_syscalls-191(마지막 시스템콜 번호. 저의경우는 260) 이렇게 나왔습니다. .long SYMBOL_NAME(sys_ni_syscall) .endr
이렇게 2개를 추가하고 커널컴파일을 하였을때는 newsyscall1은 제대로 실행이되고, 마지막 시스템콜인 newsyscall2는 불러도 반응이 없습니다.(그냥 프롬프트만 떨어집니다.)
2번째 시스템콜이 잘못된것인가해서 3번째 시스템콜을 추가해서 테스트해봤는데, 역시 1번째 시스템콜을 제외하고는 아무 반응이 없습니다.
그래서 1번인 newsyscall과 3번인 newsyscall3을 지우고 newsyscall2 1개만을 추가해서 실행해봤는데... 이 경우에는 제대로 실행이됩니다.
지금 문제는 시스템콜을 딱1개만을 추가해서 실행하는것이 문제라 시스템콜을 계속 바꿔가면서 공부하면 해결됩니다.
하지만, 2개이상의 시스템콜을 추가해야할때가 필요할것 같아서 질문 올립니다.(커널에 제가 만든 시스템콜을 모아두고 싶기도 하고요. :D )
제가 사용하는 리눅스는 RedHat 9.0 이고, 커널 버전은 2.4.20-8c 입니다.
답변 부탁드리고... 즐거운 이브되세요 ^^
ps: 저에게는 저주받은 이브 ㅜ.ㅜ
능력이 없어서... 내일도 학원나와야하는 블랙 크리스마스 ㅜ.ㅜ
커널쪽으로 q&a같은 게시판이나 활동이 활발한 사이트 좀 알려주세요.
몇가지 의문점이 있습니다.1. NR_syscalls이 어떤 값으로
몇가지 의문점이 있습니다.
1. NR_syscalls이 어떤 값으로 정의 되어 있는지 궁금합니다.
위의 코드상으로는 256이상으로 설정되었을 것 같습니다만...
2. 위의 코드상으로는 NR_syscalls이 256 이상으로 정의된 것 같습니다. 현재 커널 2.4.20에서는 시스템콜을 252개를 구현했거나 구현을 위해 예약하고 있습니다.
그러면 253~258사이의 sys_call_table은 어떤식으로 처리하였는지요?
아래 코드의 바로 윗부분을 보여주셔도 됩니다.
http://linuxkernel.net/q&a가 제가 가
http://linuxkernel.net/
q&a가 제가 가본 국내 홈페이지 중에서 가장
활발한것 같습니다.
촌놈.
/usr/src/linux/include/asm/unistd.h 입니다.
/usr/src/linux/include/asm/unistd.h 입니다.
/usr/src/linux/arch/i386/kerenl/entry.S 입니다.
제일 의심스러운 부분이 NR_syscalls가 어떤 값으로 정의되어 있는
제일 의심스러운 부분이 NR_syscalls가 어떤 값으로 정의되어 있는지 궁금했는데 그 부분은 안올려주셨네요. :D
증상이 시스템 콜을 한개만 추가하면 올바르게 동작하고 그 이상이면 동작하지않는다고 하셨는데 NR_syscallls값이
너무 작게 설정되어서 추가된 시스템콜이 오버플로우가 났는지 의심했습니다.
한번 확인해 보시죠. 현재 소스상으로는 260으로 설정되어 있으면 NR_syscalls문제이고 그렇지 않으면
다른 문제인 것 같습니다.
그럼 수고하세요..
댓글 달기