디바이스 드라이버 개발좀 공부하려고 하는데 컴파일부터 안대네

s97083의 이미지

#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif

#define __NO_VERSION__
#include <linux/module.h>
#include <linux/version.h>
#include <linux/fs.h>

struct file_operations Fops = {
NULL, /* owener */
NULL, /* llseek */
NULL, /* read */
NULL, /* write */
NULL, /* readdir */
NULL, /* poll */
NULL, /* ioctl */
NULL, /* mmap */
NULL, /* open */
NULL, /* flush */
NULL, /* release */
NULL, /* fsync */
NULL, /* lock */
NULL, /* readv */
NULL, /* writev */
NULL, /* sendpage */
NULL /* get_unmapped_area */
};

int init_module()
{
if (register_chrdev(213, "hello", &Fops) < 0)
return -EIO;

printk("hello.o start\n");

return 0;
}

void cleanup_module()
{
unregister_chrdev(213, "hello");
printk("hello.o end\n");
}

컴파일은 다음과 같이 한다.

gcc -o hello.o -c -D__KERNEL__ -DMODULE -O -Wall -I/usr/include hello.c
이걸 그대로 따라 했거든여 그런데

In file included from /usr/include/linux/fs.h:23,
from hello.c:11:
/usr/include/linux/string.h:8:2: warning: #warning Using kernel header in
hello.c:13: variable `Fops' has initializer but incomplete type
hello.c:14: warning: excess elements in struct initializer
hello.c:14: warning: (near initialization for `Fops')
hello.c:15: warning: excess elements in struct initializer
hello.c:15: warning: (near initialization for `Fops')
hello.c:16: warning: excess elements in struct initializer
hello.c:16: warning: (near initialization for `Fops')
hello.c:17: warning: excess elements in struct initializer
hello.c:17: warning: (near initialization for `Fops')
hello.c:18: warning: excess elements in struct initializer
hello.c:18: warning: (near initialization for `Fops')
hello.c:19: warning: excess elements in struct initializer
hello.c:19: warning: (near initialization for `Fops')
hello.c:20: warning: excess elements in struct initializer
hello.c:20: warning: (near initialization for `Fops')
hello.c:21: warning: excess elements in struct initializer
hello.c:21: warning: (near initialization for `Fops')
hello.c:22: warning: excess elements in struct initializer
hello.c:22: warning: (near initialization for `Fops')
hello.c:23: warning: excess elements in struct initializer
hello.c:23: warning: (near initialization for `Fops')
hello.c:24: warning: excess elements in struct initializer
hello.c:24: warning: (near initialization for `Fops')
hello.c:25: warning: excess elements in struct initializer
hello.c:25: warning: (near initialization for `Fops')
hello.c:26: warning: excess elements in struct initializer
hello.c:26: warning: (near initialization for `Fops')
hello.c:27: warning: excess elements in struct initializer
hello.c:27: warning: (near initialization for `Fops')
hello.c:28: warning: excess elements in struct initializer
hello.c:28: warning: (near initialization for `Fops')
hello.c:29: warning: excess elements in struct initializer
hello.c:29: warning: (near initialization for `Fops')
hello.c:31: warning: excess elements in struct initializer
hello.c:31: warning: (near initialization for `Fops')
hello.c: In function `init_module':
hello.c:35: warning: implicit declaration of function `register_chrdev'
hello.c:36: `EIO' undeclared (first use in this function)
hello.c:36: (Each undeclared identifier is reported only once
hello.c:36: for each function it appears in.)
hello.c:38: warning: implicit declaration of function `printk'
hello.c: In function `cleanup_module':
hello.c:45: warning: implicit declaration of function `unregister_chrdev'
hello.c:47:2: warning: no newline at end of file
/usr/include/linux/kdev_t.h: At top level:
hello.c:13: storage size of `Fops' isn't known

에러만 이렇게 엄청나게 나와요 su 를 써서 root 권한 얻고서도 해밧는데도
똑같고여 리눅스 버전은 레드햇 8.0 내지는 7.0 같은데 안대는 이유를 모르겠
어여
그리고여 이미 설치되 있는 다른 장치들의 소스는 어느 디렉토리에 있나여

s97083의 이미지

에구 이런 제목이 반말로 되버렸네여 지우고 다시 쓰려고 해도 방법을 모르겠어여 이해해 주세요~

ColdHeart의 이미지

참고하고 있는 자료가 책인지 아님 다운 받은것인지 모르겠지만
서문에 서술하고 있는 커널 버젼에 대해 언급한 부분을 보길 바랍니다.

운형의 이미지

-I/usr/include 요거 잘못되있네요..

Quote:

-isystem /lib/modules/`uname -r`/build/include: You must use the kernel headers of the kernel you're compiling against. Using the default /usr/include/linux won't work.
(The Linux Kernel Module Programming Guide)

make파일 만들기 구차나서 그냥 알리아싱 해서 쓰고 있네여.. 전.. ㅋ

alias kgcc='gcc -c -O2 -DLINUX -DMODULE -D__KERNEL__ -isystem/lib/modules/`uname -r`/build/include'
[/code]

Do you think that's the air you are breathing now?

은영신랑의 이미지

-> kernel source가 /usr/src/linux2-4 에 있을경우

cc -D__KERNEL__ -DMODULE -I/usr/src/linux-2.4/include -c file.c

로 해보시지요..

s97083의 이미지

디바이스 드라이버를 공부하고자 하는데 쉬운책좀 소개해 주세요

이해도 못하면서 리눅스 디바이스 드라이버라는 오일리책을 읽었는데

무슨 말인지 하나도 모르겠더라고여 강좌와 예제 샘플이 나온곳도 추천해 주시면 감사하겠습니다. kldp에서 의외로 찾기 힘들더라고여

s97083의 이미지

T.T 컴파일 성공해서 조아라 했더니만 이젠 등록이 안대네여
insmod hello.o

이러니까 insmod 를 찾을 수 없데여 요즘에 와서 바뀐건가여 bin 디렉토리에 보니까 파일이 없던데

운형의 이미지

insmod는 bin에 없을 거에여..

/sbin/에 있지 안나 싶군요...

물론 root로 해야 하구...

코드는 별로 틀릴게 없는데...

아.. 그리고 책이요...

책보다는 문서 참고하세요...
http://www.tldp.org/LDP/lkmpg/ 에 가시면
The Linux Kernel Module Programming Guide 가 있습니다.
kldp에도 번역문서가 있는데 버전이 낮아서 2.0 2.2기준의 이야기를 써논거라 좀 그렇네요...
영문이긴 한데... 그래도 봐줄만 합니다. 그리고 커널 관련 부분을 아셔야 오렐리 책 이해 갈겁니다.

저도 첨에는 이게 몬소린가 했는데...
Understanding the LINUX KERNEL 2nd읽고 나서야 리눅스 디바이스 드라이버책이 이해 되더군요...

아 그리고 관련 사이트... 이호씨가 운영하는 사이트
http://linuxkernel.net
에 가시면 관련 q&a가 있구요.. 쥔장인 이호씨가 아직도 질문에 답해주고 있네요...

==3=3=333

아쉽게도 리눅스 커널의 이해2판도 번역본이 없는 걸로 알고 있습니다.
1판은 2.0 2.2 기준이고 네트웍 관련 부분이 없습니다.

참고가 됬을 런지....

Do you think that's the air you are breathing now?

ydongyol의 이미지

저두 커널 공부하고 있는데요..
일반적으로 커널공부할때 만들어 보는 프로그램이 뭐가 있을까요?
드라이버라는 것이 하드웨어랑 맞물리는거라 특별한 하드웨어가 없는한 방향잡기가 힘든데
hello.c나 기본적인 구조를 파악했다 싶을때 개인 프로젝트로 뭐를 만들어 보면 좋을가요?

--
Linux강국 KOREA
http://ydongyol.tistory.com/

댓글 달기

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