커널 소스에 시스템콜 추가 하는 방법?
글쓴이: ysscuba / 작성시간: 화, 2004/03/02 - 6:02오후
리눅스 커널 2.4.25 버전에 시스템콜을 하나 추가 하려고 합니다.
커널 소스를 건드려 본적이 없어서 공부하는 중인데요... ^^;;
지금 제 짧은 생각으로는 그냥 gettimeofday() 와 같은 시스템콜이 어떻게 짜여져 있나 분석해 보고 비슷하게 하나 추가 하려고 하는데요...
제가 궁금한건...
이런 경우 제가 커널의 어떤 임의의 파일 XXX.c 를 수정 하였다고 할때...
전체 커널을 다시 컴파일 (make...) 하고 이미지 올려 주고 해야 하는 건가요?
당연히 그래야 겠죠? ^^;;
아니면 전체 컴파일 안하고 수정된 커널을 사용하는 방법이 있나요?
Forums:
커널을 컴파일해야합니다.매번 make clean 해서 컴파일한 파일들
커널을 컴파일해야합니다.
매번 make clean 해서 컴파일한 파일들을 클린시켜버리면.. 속도 엄청 걸리죠.. 그러지말고 수정하고 make bzImage 바로 하셔서 교체해주시면됩니다. 시스템콜은 콜테이블이랑 그런게 정해져 있는 파일이 시스템부팅부이기 때문에, 컴파일을 다시해주어야합니다.
힘내세요.
헐.. kldp 첨 써보는데 이거원 모가몬지 모르겠네요...위에 주제
헐.. kldp 첨 써보는데 이거원 모가몬지 모르겠네요...
위에 주제는 몰 쓰는건지.... -_-
암튼 윗분이 말씀하셨듯이 커널 수정해서 컴파일 다시 해주어야 됩니다.
하지만 컴파일만 해서는 작동 안될거구요..
user모드에서 컴파일 전에 unistd.h 헤더파일 옮겨주셔야 되요.(당연한건가요. -_- 전 이것땜에 커널 10번도 넘게 컴파일 했습니다.)
시스템콜 내부 동작원리는 웹 상에도 많지만 커널의 이해 책에 잘 나와있습니다.
웹상의 문서보다 좀 더 내부적으로 들어가서 에러 검출 방법이나 매개변수 받는 방법에 대한 설명이 추가적으로 있습니다.
순간을 지배하는 사람이 인생을 지배한다.
답변 감사드려요~~ ^^
>> user모드에서 컴파일 전에 unistd.h 헤더파일 옮겨주셔야 되요.(당연한건가요. -_- 전 이것땜에 커널 10번도 넘게 컴파일 했습니다.)
어디로 옮겨주셔야 되는지요? ^^;;
/usr/include 정도로 옮기면 되는건가요?
>> 웹상의 문서보다 좀 더 내부적으로 들어가서 에러 검출 방법이나 매개변수 받는 방법에 대한 설명이 추가적으로 있습니다.
커널의 이해책 샀습니다.
시스템콜 chapter를 읽었더랬죠...
그리고... 위에 말씀하신 에러검출이랑 매개변수 부분은...
The Part that I didn't understand in the book YET -.-;;
거의 다 왔는가라고 생각했었는데...
아직 가야 할 길이... -.-
..저두 커널을 공부하고 싶은 사람인데요
:?:
시스템 콜들을 저장하고 관리하는 부분을 구현한 파일의 이름이 무엇인가요?
처음 공부해봐서리 system_call() 에서 직접 시스템 콜을 호출하는 것까지는
알아냈는데 system_call을 구현한 파일만도 여러개던데 어떻게 딱 내가 원하
는 파일인 알수가 있을까요?
________________________
이제는 커널이다.....
________________________
커널 매니아를 위한 리눅스 프로그래밍 책 읽어보세요.
학교 숙제 하고 있죠.?^^
교학사에서 나온 그 책 읽어보면 원하는 내용 잘 나와있습니다.
/usr/include/asm
/usr/include/asm
순간을 지배하는 사람이 인생을 지배한다.
http//user.chollian.net/~jackcom/study/l
http//user.chollian.net/~jackcom/study/linux/linux_kernel.htm
여길 찬찬히 읽어보시길....
다 덤벼! 다 받아줄께!!
위의 사이트에 가서 따라해 보았는데...
위의 알려 주신 사이트가 정말 도움이 많이 되었습니다.
그런데... 사이트에서 설명해 주는 테스트 프로그램을 실행 하려고 하는데요...
Hello World를 시스템콜을 이용해서 printk 하는 프로그램인데요...
가르쳐 주는 대로 먼저...
1. include/asm-i386/unistd.h 에서 2.4.25 커널의 마지막이 252번으로 잡혀 있더군요. 그래서 #define __NR_newsyscall 253 으로 추가를 하고...
2. arch/i386/kernel/entry.S 에서 253번째에 맞춰서
.long SYMBOL_NAME(sys_newsyscall) 을 추가 해 주었습니다.
3. kernel/ 디렉토리에 아래와 같이 newfile.c를 만들고...
makefile에 추가 해 주었습니다.
4. 이제 커널을 다시 make bzImage 해서 컴파일 해 주고... 컴파일 된 커널을 이용하여 리부팅 하였습니다. 이 부분 까지는 잘 됩니다. 컴파일도 에러 없이 잘 됩니다.
5. 문제는 사용자레벨 응용프로그램을 아래와 같이 test.c 로 만들고
gcc 로 컴파일을 하면 아래와 같은 에러가 발생 합니다.
분명 __NR_newsyscall 을 찾는걸 보면 커널은 제대로 컴파일 되었다는것 같은데...
혹시 gcc 로 컴파일 할때 무슨 옵션을 주어야 하는 건가요?
위의 test.c 파일이 왜 컴파일이 안 되는 걸까요?
주말 내내 삽질 하다 여쭤 봅니다. ㅜ.ㅜ
방금 혹시나 해서 gcc -I /usr/src/linux/include test.c 으로 컴파일 해 보았습니다.
결과는 역시... -.-
[root@localhost test]# gcc -I /usr/src/linux/include test.c
/tmp/ccdKf7pJ.o(.text+0x1c): In function `newsyscall':
: undefined reference to `errno'
collect2: ld returned 1 exit status
저도 errno가 없다고 나오는군요...
아무리 책이나 웹을 검색해봐도 답변이 없네요...
(이 문제가 발생한 경우는 저와 여기 글올리신 분을 포함해서 3번 보았습니다...역시 답변은 없구요...ㅜ.ㅜ)
이게...시스템콜 추가시의 문제라기 보다는 무언가 다른게 있는것 같은데.. 그것이 뭔지 모르겠군요...흠...
^^;;
어플리케이션 소스에
#include <errno.h> 라는 헤더를 인클루드하면 되는거였네요..ㅎㅎ
진짜루여?
진짜루여?
아침에 일어나자 마자 KLDP로 들어오게 되는군요 -.-;;
어제 올린 질문에 대한 답변이 있는지 들어와 봤는데...
혹시 진짜 errno.h 만 더해 주면 되는 거라면 진짜... -.-;;
빨랑 테스트 해 봐야 겠습니다. ^^
잘 되내요 ^^
컴파일 잘 되고... 실행도 잘 되내요... ^^
그런데 질문에 있습니다.
사용자 응용 프로그램에서
#include <linux/unistd.h> 하면 안되고...
#include </usr/src/linux/include/asm-i386/unistd.h> 로 하던가
컴파일 할때 gcc -I /usr/src/linux/include test.c 로 해 줘야 하는데...
이거 환경 설정에서 어떻게 하면 그냥 #include <linux/unistd.h> 로 해도 컴파일이 잘 될수 있지 않나요?
gcc 환경 설정 중에 있는 건지... 아니면 PATH 설정을 해 줘야 하는 건지...
소스 코드에 절대 경로로 작성 하지 않고... gcc -I 하지 않고
#include <linux/unistd.h> 할 수 있는 방법을 알고 싶습니다.
#include <errno.h> 는 #include </usr/include/errno.h> 라고 안 해 줘도 잘 되잖아요... ^^
음 짧은 소견이지만^^
저두 숙제하느라 열심히 커널 컴파일하구 드라이버들 깔구
주말내내 끙끙대다가 지금 하나씩 해보구 있습니다.
그런데 문제의 unistd.h를 우리가 바꿨기 때문 아닐까요
즉 errno.h는 고친 것이 없으므로 시스템이 깔려 있는 라이브러리를 써도
되겟지만 unistd는 바뀐 내용이 있기때문에 직접 시스템의 lib디렉토리에서
가져다 쓸수 없다구 생각이 되는데.........
________________________
이제는 커널이다.....
________________________
제 소견으로는 ^^
링크를 걸어주면 문제가 해결될듯한데요 ^^;
나는 본인이 맞음을 증명하노라 ㅋ
링크를 걸어 주라는 건?
링크를 걸어 주라는 건
소프트 링크를 말씀하는 건가요?
ln -s 써서 파일을 링크 걸라는 말씀? ^^;;
네 ^^
소프트 링크 입니당!~~~
ln -s
^^
근데 혹시 운영체제 숙제 하고 계세요?
ㅎㅎ
나는 본인이 맞음을 증명하노라 ㅋ
예...
예... ^^
이 글의 조회수가 800을 넘어섰내요... ^^
KLDP에 처음 올린 글이 이렇게 히트를 치다니... -.-ㅋ
도움 주신 분들 감사드립니다... ^^
^^^
다 우리 학교 학생들이 아닐까요? 하하
나는 본인이 맞음을 증명하노라 ㅋ
#include 질문
궁금한 점이 생겼습니다.
이제 다 잘 되는데...
제가 고친 소스들을 묶어서 다른 컴퓨터에서
고친 소스들을 가지고 다시 커널 컴파일을 해서 테스트를 해 볼 텐데...
여기서 /usr/src/linux 가 아닌 다른 디렉토리로 되어 있다면...
#include </usr/src/linux/include/asm-i386/unistd.h> 가 컴파일 에러를 발생 할텐데...
음...
이건 어떻게 해결 할 수 있을까요? -.-;;
절대 경로를 쓰지 않고 할 수 있는 방법이 있을 것 같은데...
ln -s 는 이런 경우에 안되잖아요...
#include </usr/src/linux-2.6.10/inclu
#include </usr/src/linux-2.6.10/include/asm-i386/unistd.h>
#include<errno.h>
_syscall0(int, newsyscall);
main()
{
int i;
i = newsyscall();
}
이렇게 하니깐..ㅡㅡ;; 에러 없이..오브젝트 파일이 맹글어지네요
모가 이런지...쩝..
Re: 잘 되내요 ^^
C_INCLUDE_PATH
자세한 것은 셸 상에서
혹은
http://ou800doc.caldera.com/cgi-bin/info2html?(gcc.info)Environment%2520Variables&lang=en
댓글 달기