kernel 2.6 module programming 질문

new5244의 이미지

fedora 를 쓰며 kernel 은 rpm 형태로 된 것을 사용해서 2.6.1 로 up 했습니다 (소스도 같이 설치)

linux kernel module programming guide(kernel 2.4 를 기준으로 작성된 문서네요)를 보고 있는데 컴파일한 커널 모듈이 올라가지 않네요.

# insmod hello-1.o
insmod: error inserting 'hello-1.o': -1 Invalid module format

kernel 2.6 부터는 커널 모듈이 .o 에서 .ko 로 바뀐것으로 알고 있는데.....

kernel 2.6 에서 모듈 컴파일은 어떻게 하며 모듈은 어떤 방식으로 올려야 되는지 알려주시면 고맙겠습니다.

new5244의 이미지

에구.... 삽질끝에 겨우 모듈을 올렸습니다...

혹시 ... 저와 비슷한 고민을 하시는 분들을 위해 제가 사용한 방법을 올립니다.

커널 2.6 모듈 소스코드와 컴파일시 나오는 명령을 카피해서 사용했습니다.

hello.c

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

#define DRIVER_AUTHOR "saibi"
#define DRIVER_DESC "test module"

int init_module(void)
{
	printk("<1>Hello world 1.\n");

	return 0;
}

void cleanup_module(void)
{
	printk("Goodbye world 1.\n");
}

module_init(init_module);
module_exit(cleanup_module);

MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");

hello.mod.c

#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>

MODULE_INFO(vermagic, VERMAGIC_STRING);

static const struct modversion_info ____versions[]
__attribute__((section("__versions"))) = {
};

static const char __module_depends[]
__attribute_used__
__attribute__((section(".modinfo"))) =
"depends=";

compile & linking


# gcc -Wp,-MD,.hello.o.d -nostdinc -iwithprefix include -D__KERNEL__ -I/usr/src/linux-2.6/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -pipe -msoft-float -mregparm=3 -mpreferred-stack-boundary=2 -march=pentium3 -I/usr/src/linux-2.6/include/asm-i386/mach-default -O2 -fomit-frame-pointer -g -Wdeclaration-after-statement -DMODULE -DKBUILD_BASENAME=hello -DKBUILD_MODNAME=hello -c hello.c


# gcc -Wp,-MD,.hello.o.d -nostdinc -iwithprefix include -D__KERNEL__ -I/usr/src/linux-2.6/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -pipe -msoft-float -mregparm=3 -mpreferred-stack-boundary=2 -march=pentium3 -I/usr/src/linux-2.6/include/asm-i386/mach-default -O2 -fomit-frame-pointer -g -Wdeclaration-after-statement -DMODULE -DKBUILD_BASENAME=hello -DKBUILD_MODNAME=hello -c hello.mod.c

# ld -m elf_i386 -r -o hello.ko hello.o hello.mod.o

loading

# insmod hello.o

# lsmod
Module                       Size    Used by
hello                          1536   0
md5                           4224   1
......

일단 이렇게 하니 모듈이 커널에 잘 올라가네요...

xxxx.mod.c 와 컴파일 옵션에 대해 잘 아시는 커널 고수님들...
왜 이렇게 해야하는지 설명좀 해 주시면 고맙겠습니다.

그럼....

from saibi

ai의 이미지

저도 일전에 kernel-2.6 대응의 모듈을 올리기 위해 삽질(?)을 했었는데 기존 2.4 에서 사용하던 방법과는 좀 달라진 것 같더군요. new5244 님께서 하셨던 것처럼 make modules modules_install 에서 긁어와 붙여넣기를 했습니다.

http://cizz.net/wiki/wiki.php/Patch-O-Matic

kernle-2.6 모듈에 관련된 문서가 있으면 저도 좀 읽어보고 싶습니다. 그나저나 새로운 pom 은 언제 나올런지.. 이달 중으로 발표된다는 이야기를 얼핏 들었던 것 같습니다만.

War doesnt determine whos right, just whos left.

댓글 달기

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