모듈프로그램 컴파일후 insmod때 커널 버전차이 문제

keedi의 이미지

안녕하세요.

kldp내에 있는 문서를 참조하여 간단한 모듈프로그램 실습 중입니다.
단순히 모듈적재시 메시지를 뿌려주고 모듈해제시 메시지를 뿌려주는
간단한 모듈 프로그램을 작성했습니다. 컴파일까지 완료를 했는데
커널 버전 문제 때문에 모듈이 적재되지 않습니다.

아래쪽에 비슷한 질문이 있어서 체크해보았는데 커널 버전 관리를
꺼라는 답말고는 뾰족히 잘 이해가 되지 않는군요.

말 그대로 현재 제 데비안 커널은 2.4.18-bf2.4 인데 커널 모듈의
버전은 2.4.18이라서 문제가 생기는 것 같지만 왜 이런 문제가 생기는지
이럴때는 어떻게 해야 이 상황을 해결할 수 있는지 너무 궁금합니다.
사실 2.4.18의 커널 체계는 이해하겠는데 저기 bf2.4는 무엇을 의미
하는지도 잘 모르겠습니다. 이것도 알려주시면 감사하겠습니다.

버전관리를 끄거나 강제로 모듈을 올리는 방법말고 버전을 어떻게든 맞추고
싶은데 어찌해야 하는지 도통 모르겠네요.

많은 지도편달(?) 부탁드립니다. :-)

아래는 에러 메시지입니다.

Quote:
guest01@vitsal:~/OS$ su
Password:
vitsal:/home/guest01/OS# insmod hello_module.o
hello_module.o: kernel-module version mismatch
hello_module.o was compiled for kernel version 2.4.18
while this kernel is version 2.4.18-bf2.4.

vitsal:/home/guest01/OS#

제 모듈 소스 코드입니다.

/************************************************
 *      module programming
 ************************************************/
#include <linux/kernel.h>
#include <linux/module.h>

int init_module() {
        printk("Hello Module!! I'm in Kernel\n");

        return 0;
}

void cleanup_module() {
        printk("Bye Module!!\n");
}

컴파일 옵션입니다.

Quote:
guest01@vitsal:~/OS$ gcc -D__KERNEL__ -DMODULE -DLINUX -c hello_module.c

그리고 제 리눅스의 버전 정보 입니다.

Quote:

guest01@vitsal:~/OS$ uname -a
Linux vitsal 2.4.18-bf2.4 #1 Son Apr 14 09:53:28 CEST 2002 i686 unknown
guest01@vitsal:~/OS$
ktd2004의 이미지

gcc가 컴파일되면서 참고하는 헤더파일 디렉토리가
/usr/include일겁니다.
그리고 모듈 컴파일할 때 필요한 헤더파일들은 /usr/include/linux와
/usr/include/asm에 보통 들어있습니다.

배포판을 설치하면(레드헷) /usr/include/{linux,asm}의 경우
커널 소스에 심볼릭링크로 걸려있지 않고 그대로 존재합니다.
따라서 커널을 업그레이드 했다거나 하면
/usr/src/linux-2.x.x를 /usr/src/linux로 심볼릭 링크를 걸고
/usr/include/{linux,asm}을 /usr/src/linux/include/{linux,asm}으로 심볼릭 링크를 걸어주게 됩니다.

그리고 레드헷9의 경우에는 커널 버전은 2.4.20-8인데

커널 소스의 Makefile에 보면 EXTRAVERSION이 8custom으로 정의되어 있습니다.
따라서 이 커널 소스를 가지고 모듈을 컴파일하게 되면
커널 버전은 2.4.20-8, 컴파일된 모듈의 버전은 2.4.20-8custom으로 되어서 님께서 보신 에러메세지와 같은 메시지가 나오게 됩니다.

이 부분을 확인해 보시는 게 좋을 것같습니다.

그리고 참고로 커널 소스의 Makefile을 수정하셨다면
커널을 다시 컴파일 하셔야 합니다.
커널이 컴파일되면서 몇개의 중요한 헤더파일을 변경된 정보로 갱신시키니까요. 만약 컴파일을 다시 하지 않으면 변경사항을 모듈을 컴파일 시키거나 할때 반영되지 않습니다.

그럼...

Prentice의 이미지

참고로 커널 옵션 중에, 커널 버젼이 다르더라도 모듈을 읽을 수 있게 해주는 옵션이 있습니다.

valor의 이미지

가장 쉽고 확실한 방법은 참조하신 헤더 파일을 가진 커널 소스로 커널 이미지를 컴파일하여 그 커널로 부팅하는 방법이 아닐까 싶군요.

예전에 경험한 바로는 같은 헤더로 만들어진 커널 이미지와 모듈도 이후에 모듈에 새로운 symbol을 export한 후에 컴파일을 하여 로드하면 다른 커널 버전이라는 메시지를 뿌린 적이 있었습니다...

export된 심볼 뒤에 붙는 postpix (/proc/ksyms에 있습니다.)가 생성되는 과정에 뭔가 심오한 것이 있는 것같습니다. (분석을 안해봐서리... ^^)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.