kernel내 시스템콜 추가시 entry.S의 문제
안녕하세요.
지금 kernel내 printk를 수행하여 메시지를 뿌려주는 시스템 콜을 구현하는
간단한 시스템 프로그래밍을 하고 있는데 문제에 봉착했습니다.
현재 2.4.26커널 소스를 다운받아서 작업중입니다.
/usr/src/linux-2.4.26/
위의 위치에 소스를 일단 풀었습니다.
교학사 - 리눅스 매니아를 위한 커널 프로그래밍 교재를 참고하고, kldp의
여러 문서를 참고하며 작업중인데 우선 위의 소스를 푼 디렉토리 기준으로
1. include/asm_i386/unistd.h에
#define __NR_free_hugepages 251
#define __NR_exit_group 252
/* keedi's option - start */
#define __NR_keedi_syscall 253
/* keedi's option - end */
이렇게 주석과 함께 define문을 추가했습니다.
2. 다음으로 arch/i386/kernel/entry.S 에
.long SYMBOL_NAME(sys_keedi_syscall) 을 추가하려고 하는데.
드디어 저의 지식으로 커버할 수 없는 부분에 봉착해버렸습니다!
바로 entry.S파일에 .long SYMBOL_NAME(sys_ni_syscall) 이라는 부분이
빼곡히 들어가 있는 것입니다. 심지어 위의 제가 unistd.h에 추가할때 있는
#define __NR_free_hugepages 251
#define __NR_exit_group 252
부분들 조차도
.long SYMBOL_NAME(sys_ni_syscall) /* sys_free_hugepages */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_exit_group */
이렇게 처리 되어 있는것입니다. 물론 제가 넣고 싶은 253번째에도
.long SYMBOL_NAME(sys_ni_syscall) /* sys_lookup_dcookie */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_create */
...
이렇게 쭈욱 차있는 것입니다.
실제로 258번즈음에
.long SYMBOL_NAME(sys_ni_syscall) /* sys_set_tid_address */
로 마지막에 있어서 마지막 부분인 이 다음에 어쩔수 없이
/* keedi's option - start */
.long SYMBOL_NAME(sys_keedi_syscall) /* keedi's system call */
/* keedi's option - end */
라고 추가 했습니다. - 좀 찜찜하긴 하지만... 다른 분들은 다 저런 부분이
없으신것 같더라구요... 저것들이 무엇을 위한것인지도 잘 모르겠고 왜
unistd.h와 entry.S와 내용이 다른지(위와 같이 sys_ni_syscall 부분요.)도
도통 모르겠고...
어쨌든! 저부분을 저렇게 완료를 한뒤에 kernel 하부에 직접 구현해주는
시스템 콜을 구현했습니다. makefile에도 추가를 해줬으며 다시
make bzImage 를 한뒤에 lilo를 실행해주고 다시 재부팅을 했습니다.
시스템 콜을 실행하는 사용자 어플리케이션을 만든뒤 컴파일을 했더니
__NR_keedi_syscall 부분이 undeclared되었다고 에러가 났습니다.
이곳 게시판의 질답을 참고하여 컴파일시 -I /usr/src/linux-2.4.26/include/
부분을 추가했더니 컴파일은 무사히 되었습니다.
그런데 실행을 했더니 printk("Hello World!\n"); 부분이 있음에도 불구하고
콘솔과 dmesg 또는 /var/log/messages에 전혀 Hello World! 부분이
출력되지 않습니다.
아무래도 entry.S 부분에서의 문제 때문에 무언가가 잘 풀리지 않는 것
같습니다. 아니면 고수님들이 보시기에 다른 부분의 문제가 있다면 좀 지도
부탁드립니다.
더불어 위의 entry.S의
.long SYMBOL_NAME(sys_ni_syscall) /* sys_lookup_dcookie */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_create */
...
부분과 같이 sys_ni_syscall이 대체 무엇인지...
그리고 저것들이 unistd.h에 시스템콜 디파인부분이 252번 까지 있음에도
불구하고 왜 entry.S에는 추가해야할 253번 부분부터 쭈욱 sys_ni_syscall
이라는 것으로 가득 차 있는 것인지 이럴때 추가하려면 어떻게 해야하는
것인지...
답변 부탁드립니다.
너무 간단한 실습 조차도 맘대로 되지 않아 정말 소울패닉 상태랍니다. ㅠㅠ
김도형 드림
일단 임시로 해결은 보았습니다만.
.long SYMBOL_NAME(sys_ni_syscall) /* sys_free_hugepages */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_exit_group */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_lookup_dcookie */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_create */
...
부분에서 253번째 부분인 sys_look_up_dcookie부분을 그냥 무시해버리고
sys_ni_syscall을 제가 만든 sys_keedi_syscall로 바꾸어 버리니까
일단 시스템 콜 구현은 되더군요.
막막해서 에잇 될대로 되라는 심정으로 저렇게 해버렸는데 아무 문제가
없는 것인지요. 뒤의 주석을 보니 무언가 어떤 시스템 콜에서 필요로
하는 것 같기도 한데... 왜저런 상황이 있는 것인지 저것이 무엇을 의미하는지는
아직도 아리송 하네요...
----
use perl;
Keedi Kim
다른건 모르겠는데sys_ni_syscall은...구현되지 않은 시
다른건 모르겠는데
sys_ni_syscall은...
구현되지 않은 시스템콜인데요.
not implemented system call이라서
ni_syscall 인듯
커널 소스를 보시면
/kernel/sys.c
http://home.postech.ac.kr/~sodomau
[quote="sodomau"]다른건 모르겠는데sys_ni_sysca
그랬군요!! 감사합니다. 그렇담 괜히 걱정을 했던 것일까요?
무언가가 한참동안 찜찜했는데 일단 한 걱정 덜었습니다.
그런데 교재나 문서에는 시스템 콜 구현이 256개인가? 이렇게 개수의
제한이 있던데 예약이 되어있거나 또는 구현을 위해 남겨둔 것이 이보다
훨씬 많을 수 있는 것은 커널내부의 무엇인가가 바뀌었기 때문인지요?
그렇다면 이제는 시스템콜이 몇개까지나 구현 가능한것인지 커널 내부 동작의
무엇이 바뀌었는지 궁금합니다.
----
use perl;
Keedi Kim
시스템 콜 번호..
리눅스의 각 시스템 콜에는 고유한 번호가 부여되어 있는데
그 번호는 한번 결정된 후에는 변경이 되질 않습니다.
(만약 변경한다면 이미 컴파일된 응용 프로그램이 정상적으로 동작하지 않을 것 입니다.)
그래서 나중에 그 시스템 콜이 없어진다 하더라도
그 번호를 다시 쓸수가 없게 되는데
이 경우 기존의 시스템 콜 번호를 유지하기 위해서
더미 함수를 하나 연결시켜 두게 되는 것입니다.
이 때 사용하는 것이 sys_ni_syscall 로서
단순히 -ENOSYS 에러를 리턴하도록 구현되어 있습니다.
그리고 커널 버전 2.4.20 까지는
시스템 콜 갯수가 256 으로 정해져 있다가
2.4.21 에서 270 으로 늘어난 후에
2.6 대에서는 제한이 사라졌습니다.
(2.5 대는 확인해 보질 않아서 모르겠습니다.. 8) )
여담입니다..^^
아마도...
저희학교 학생분같군요..^^
시험 잘 보세요^^
에궁...
70페이지가 넘는 분량을 언제 요약해서 쓰낭..ㅡ.ㅡ;;;
음, ni_syscall 이라도 혹시나 호환성을 위해서 뒤쪽에 추가하는
음, ni_syscall 이라도 혹시나 호환성을 위해서 뒤쪽에 추가하는 것이
좋아보일듯 합니다. 다른 부분은 일단, 이후에 뭔가 그 부분에 추가될 수
있다는 뜻이니 그럼 고운 하루되세요.
=========================
CharSyam ^^ --- 고운 하루
=========================
고맙습니다.
고맙습니다.
자세한 답변들 덕분에 어렴풋이나마 감이 오네요.
오늘은 5월 5일 어린이날!
다들좋은 하루 되세요~ :=)
----
use perl;
Keedi Kim
댓글 달기