>> Edit article
이름
제목
패스워드
리눅스에서 시스템콜을 추가하는 프로그래밍을 하고 배우고 있는데, 첫판부터 막혀서 도저히 진전이 안 되네요. 사흘 동안 끙끙대다가 결국 가르침을 청합니다. 제 환경은 와우리눅스7.0 (크리스마스 버전이라나... 빌린 시디라서 정확한 명칭은 모르겠습니다) 커널은 2.2.17-8kr 입니다. 인터넷에서 구한 가장 기초적인 예제를 따라서 해 보고 있는데요, (프로그래밍에 대해 그다지 전문 지식이 없어서..) 순서는 다음과 같습니다. 1. 새로 추가할 시스템콜의 명칭은 test_call 입니다. 2. /usr/src/linux/include/asm/unistd.h 파일에 # define __NR_test_call 191 을 추가했습니다. 3. /usr/src/linux/arch/i386/kernel/entry.S 에 .long SYMBOL_NAME(sys_test_call) 을 추가하고, .rept NR_syscalls-190 에서 190을 191로 바꾸어 주었습니다. 4. /usr/src/linux/kernel/ 아래에 test.c 파일을 다음과 같이 만들었습니다. #include <linux/mm.h> #include <asm/uaccess.h> #include <linux/vmalloc.h> #include <linux/kernel.h> asmlinkage int sys_test_call() { printk("hahaha"); return 0; } 원래는 서른줄짜리 코드였는데 잘 안 되길래 printk 한번만을 쓰는 두줄짜리로 고쳤지요. 5. /usr/src/linux/kernel/Makefile 에서 O_OBJS = ... 뒤에 test.o 를 추가했습니다. 위와 같이 하고, (문서에 있는 것과 동일하게) make bzImage 를 하였더니 컴파일이 무난하게 되더군요. bzImage 를 /boot/vmlinux-exp 로 복사하고 lilo.conf 에 추가하고 lilo 를 실행했습니다. 그다음 재부팅을 했는데... vmlinux-exp 로 부팅을 하면, 메세지들이 출력되다가 ..... INIT: version 2.78 booting hahaha hahaha WOW Linux... ..... 위와 같이 갑자기 두번이나 test_call 이 실행되어버립니다. 그리고 각종 데몬들이 시작되다가 syslogd 가 실행되는 순간 Starting system logger 까지 나오고는 더이상 진전하지 않습니다... 정말 간단한 예제 같은데 제대로 되지 않으니 미치겠군요. 시간이 넉넉하면 두꺼운 책 하나 구해서 차분히 보겠지만 그렇지도 않은터라 도움을 청합니다. 제가 무엇을 빠뜨렸거나 다른 이유가 있다면 가르쳐 주시면 감사하겠습니다.
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved