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

여러가지을 해보았는데 결과는 다 똑같구요..
어떻게 하면 될까요???

익명 사용자의 이미지

/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했는데요.. 결과는 같았습니다.

다른 방법이 없을까요??

익명 사용자의 이미지

두가지 경우를 생각해 볼 수 있겠습니다.
syslog 의 레벨이 printk() 의 디폴트 에러 레벨보다
높게 잡혀 있어서 콘솔로 메세지가 나오지 않을 경우.
이 경우 /var/log 아래의 로그파일 등에 메세지가
찍혀 있을 겁니다.
그리고, 컴파일 옵션에 의해서 약간 이상하게 컴파일 된 경우
가 있을 수 있겠습니다.
아무래도 컴파일할 때 section 이 바뀌었다는 메세지가 마음에
걸리네요.
컴파일 옵션과 uname -a 의 결과를 보여 주시면
알 수도 있을것 같습니다(100% 보장하지 못합니다)

그리고, /usr/include 는 gcc 가 사용하는 include 디렉토리의 루트입니다.
그것까지 커널 소스로 링크시켜주실 필요는 없습니다.
어쩌면, 모듈 초기화함수에 __init 의 attribute 를 붙여 주셔야
될런지도 모르겠습니다.

또한 커널이 모듈적재가 가능하게 컴파일되어 있는지도
혹시 모르니까(그럴리는 없겠지만) 확인해 보세요.

익명 사용자의 이미지

먼저 님의 말대로 /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에서는 정상 작동을 합니다..

익명 사용자의 이미지

# 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 관리를 해야 할 것같은데 이런 것 때문에 문제가 될
것 같아서 입니다...

catzbi의 이미지

#ifdef CONFIG_MODVERSIONS
#define MODVERSIONS
#include "linux/modversions.h"
#endif

make
"linux/modversion.h"
make hello.o
<linux/modversion.h>
간혹 list,new,modversion.h error면 해보세요.
Makefile

CC = gcc
CFLAGS = -D__KERNEL__ -DMODULE -O -Wall -I/usr/src/linux/include/ 

OBJS = hello.o

all : $(OBJS)
hello.o: hello.c 
     $(CC) -o $@ -c $<  $(CFLAGS )  
clean : 
	rm -f *.o *~

jcly2의 이미지

kernel message를 어떻게 확인하셨는지 궁금하네요.?

kernel message를 확인하고자 하는 경우에는 /proc/kmsg를 보시면
확인이 가능합니다.

가상 console이나 terminal 한 곳에 cat /proc/kmsg 하시 다음에
다른 console에서 module을 로딩하거나 언로드하시면
kernel message를 볼 수 있읍니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.