Device Drive에 관해...??(커널version....Error가 나요)

안녕하세요..
지금 오렐리에서 나온 디바이스 드라이브책을 보고 있는데요..
그중 가장 처음에 나오는 예제 프로그램을 compile하면 이상해서요..
제 환경은 MMX433, RedHat 7.0 영문(version 2.2.16-22)입니다.
/*************** Program Start ***************/
/* hello.c
gcc -c hello.c */
#define MODULE
#include
int init_module(void) { printk("<1>Hello, world\n"); return 0;}
void cleanup_module(void) { printk("<1>GoodBye\n");}
/************* Programm End ***************/
그런 후,
#gcc -c hello.c
하며 다음과 같은 warnning이 납니다.
/tmp/ccOiekSH.s Assembler messages
/tmp/ccOiekSH.s8 Warning Ignoring changed section attributes
for .modinfo
그래도 object file은 생기구요...(hello.o)
그다음 엔
#insmod hello.o
하면 다음과 같이 나와요.
hello2.o kernel-module version mismatch
hello2.o was compiled for kernel version 2.4.0-0.16
while this kernel is version 2.2.16-22.
이상한 것은 제가 compile한 환경은 2.2.16-22인데도 불구하고 2.4.0-0.16에
서 compile됐다고 하니....
그래서 version을 check할수 있는 program들이 있어서 다음과 같이 사용하였지
만 되지 않더군요...
그래서 다음 과 같은 부분도 삽입해보고, 오렐리 뒷부분의 version 확인부분
도 삽입해보고했지만...
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include
#endif
여러가지을 해보았는데 결과는 다 똑같구요..
어떻게 하면 될까요???
Re: 새로 설치한 커널 소스 디렉토리에 링크를...
/usr/include/linux
/usr/include/asm
/usr/include/scsi
등의 커널 버젼과 관련이 있는 디렉토리들을
지우고,
사용하시는 커널 버젼의 소스 디렉토리로 링크를 걸어 주세요.
다시 해 보았는데요 결과는...???
안녕하세요.
link를 걸어 줄라고 해서 link를 걸었습니다.
그런후 hello.c를 다시 컴파일했는데요...
compile시 다음과 같은 message를 볼수 있었습니다.
/tmp/ccG030dc.s Assembler messages
/tmp/ccG030dc.s9 Warning Ignoring changed section attributes
for .modinfo
hello.o object파일은 얻을 수 있었구요..
그래서
#insmod hello.o를 실행했는데요..
전과 같은 version이 틀리다는 말은 안나오구요..
od명령어로 hello.o를 살펴보니 kernel_version에 정확히 제가 사용하고 있는
kernel version이 들어 가있는 것 확인 했구요..그리고 module이 올라가 있는
것두 확인 했구요.
그런데 "Hello, World"라는 message를 출력하지 않더군요..
#rmmod hello
했을 경우에도 "Goodbye"라는 message가 화면에 출력되지 않아요..
-------------------------------------------------------
-------------------------------------------------------
제가 시도 한것은
/usr/include/linux 를 /usr/src/linux-2.2.16/linux/include/linux로 link를
/usr/include/asm 를 /usr/src/linux-2.2.16/linux/include/asm으로 link를
/usr/include/scsi 를 /usr/src/linux-2.2.16/linux/include/scsi로 link를
했습니다.
그리고 다시 hello.c를 다시 compile를 했지만 결과는 위와 같아서요..
이번에
/usr/include/ 를 /usr/src/linux-2.2.16/linux/include로 link를 한후 다시
compile했는데요.. 결과는 같았습니다.
다른 방법이 없을까요??
Re^3: 다시 해 보았는데요 결과는...???
두가지 경우를 생각해 볼 수 있겠습니다.
syslog 의 레벨이 printk() 의 디폴트 에러 레벨보다
높게 잡혀 있어서 콘솔로 메세지가 나오지 않을 경우.
이 경우 /var/log 아래의 로그파일 등에 메세지가
찍혀 있을 겁니다.
그리고, 컴파일 옵션에 의해서 약간 이상하게 컴파일 된 경우
가 있을 수 있겠습니다.
아무래도 컴파일할 때 section 이 바뀌었다는 메세지가 마음에
걸리네요.
컴파일 옵션과 uname -a 의 결과를 보여 주시면
알 수도 있을것 같습니다(100% 보장하지 못합니다)
그리고, /usr/include 는 gcc 가 사용하는 include 디렉토리의 루트입니다.
그것까지 커널 소스로 링크시켜주실 필요는 없습니다.
어쩌면, 모듈 초기화함수에 __init 의 attribute 를 붙여 주셔야
될런지도 모르겠습니다.
또한 커널이 모듈적재가 가능하게 컴파일되어 있는지도
혹시 모르니까(그럴리는 없겠지만) 확인해 보세요.
여기.. compile options과 uname 정보...
먼저 님의 말대로 /usr/include까지 link할 필요가 없어서 다시
linux, asm, scsi만 link를 걸었습니다.
다음은
# uname -a 의 내용입니다.
Linux TEST 2.2.16-22 #1 Tue Oct 16 221739 PDT 2001
그리고 제가 하려는 아시다 싶히 너무간단해서 특별한 compile option를 주지
않았습니다.
# gcc -c hello.c
다른 compile option은
# gcc -D_KERNEL__ -DMODULE -O -Wall -I/usr/src/linux/include/linux -c
hello.c
입니다.
결과는 같구요..
참고로 kernel 2.4에서는 정상 작동을 합니다..
Re^5: 여기.. compile options과 uname 정보...
# gcc -D__KERNEL__ -DMODULE -O -Wall -c hello.c
이정도로 될 거 같은데요.. -I 옵션은 링크를 걸어 주셨다면
굳이 해 주실 필요는 없는 것으로 생각되구요,
참고로 kernel 2.4에서는 정상 작동을 합니다..
어쩌면....
printk("<1>Hello, kernel\n");
등과 같이 앞에 꺾쇠 사이의 숫자를 바꿔 가면서 시도해 보면 나올지도 모르겠습니다.
2.2 에서는 컴파일시 warning 이 뜨던가요? 아님,
섹션이 재정의된다는 메세지가 뜨던가요?
참, 그리고, 소스에서 다음과 같이 MODULE 을 정의해 주면
굳이 컴파일 옵션에 -DMODULE 을 줄 필요는 없습니다.
#define MODULE
#include
int __init init_module(void) { printk("<1>Hello, world\n"); return 0;}
void __exit cleanup_module(void) { printk("<1>GoodBye\n");}
그래도 안된다면 시행착오를 거쳐서 여러번 해 봐야 겠네요..
(실력의 바닥이 드러납니다 =3=3=3)
다시한번,
현재 사용하는 커널에 MODVERSION 옵션을 주고 컴파일 했는지,
/var/log/messages 에 로그가 남는지,
등을 체크해 보시길 바랍니다.
도움 많이 못되어 드려서 죄송합니다 ㅜ.ㅜ
앗, 그리고, 사용하신 2.2 커널이 직접 컴파일하신 커널이 아니죠?
(안되니까 이것저것 갖다 붙이네요 ㅜ.ㅜ) modversion.h 등
모듈에 관련된 부분은 직접 make dep;make bzImage 등으로
손수 컴파일한 꼬옥 맞는 커널과 그 소스로 작업하지 않으면
종종 의외의 결과를 가져오기도 하더군요 ㅡ.ㅡㅋ
보다 자세한 것은 저보다 더 많이 아시는 분께서 대답해 주실지도
모르겠습니다 =3=3=3
(아... x팔려...)
--> 님의 말대로 확인해 보았습니다....희망적입니다.
messages를 주고 받은지 벌써 하루가 되었군다...
오늘 다시한번 해보았는데...
#insmod hello.o
한 다음
#cat /var/log/messages
를 확인해 보니 그곳에 "Hello World"와 "Goodbye"가 있었습니다.
그리고 printk에서 <1>을 1~9까지 바꾸어보았는데요..
결과는 모두 똑았았습니다. 1~6까지는 똑같구요.. 7때는 아무런 message가 없
습니다. 8, 9는 아무것도 아닌 것 같구요.. ^^;
그리고 커널에 관해서 물어 보셨는데, 확인해 본 결과 install때 쓰던 kernel
이 아니라 누가 compile를 한거였어요..말에 따르면 필요없는 것을 빼고
compile를 했다고 해서, 다시 install때 쓰던(Evrything으로 설치) image를 사
용해서 hello.c를 compile했습니다...
# gcc -c hello.c
결과는 ...
compile시 warning이 나타났습니다.다음과 같이.....
/tmp/ccMRK0LO.s Assembler messages
/tmp/ccMRK0LO.s9 Warning Ignoring changed section attributes
for .modinfo
이 warning은 아시다시피 처음 부터 났던 warning이구여...
그 다음에
# insmod hello.o
을 하니,
Hello World
가 화면에 나오는 것을 확인했습니다. 저희가 원하던 거였지요..
얼마나 기쁘던지...(아낌없는 조언에 감사 감사 ^^)...
그러나 하나 물어보고 싶은 것이 있습니다.
원래는 위와 같은 warning이 나오지 안아야 하는 것인데 왜 나올까요..??
제가 걱정하는 것은, 지금 hello.c는 작은 모퓰이지만 나중에 큰 모듈을 만들
때 여러 kernel version 관리를 해야 할 것같은데 이런 것 때문에 문제가 될
것 같아서 입니다...
어디에 linux/modversion.h 가 있단말이더냐...
make
"linux/modversion.h"
make hello.o
<linux/modversion.h>
간혹 list,new,modversion.h error면 해보세요.
Makefile
어
kernel message를 어떻게 확인하셨는지 궁금하네요.?ke
kernel message를 어떻게 확인하셨는지 궁금하네요.?
kernel message를 확인하고자 하는 경우에는 /proc/kmsg를 보시면
확인이 가능합니다.
가상 console이나 terminal 한 곳에 cat /proc/kmsg 하시 다음에
다른 console에서 module을 로딩하거나 언로드하시면
kernel message를 볼 수 있읍니다.
댓글 달기