디바이스 드라이버 개발좀 공부하려고 하는데 컴파일부터 안대네
#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 같은데 안대는 이유를 모르겠
어여
그리고여 이미 설치되 있는 다른 장치들의 소스는 어느 디렉토리에 있나여
에구 이런 제목이 반말로 되버렸네여 지우고 다시 쓰려고 해도 방법을 모르
에구 이런 제목이 반말로 되버렸네여 지우고 다시 쓰려고 해도 방법을 모르겠어여 이해해 주세요~
서문을 잘읽어 보길...
참고하고 있는 자료가 책인지 아님 다운 받은것인지 모르겠지만
서문에 서술하고 있는 커널 버젼에 대해 언급한 부분을 보길 바랍니다.
인클루드 시킨 디렉토리가 잘못&#46124;구뇨..
-I/usr/include 요거 잘못되있네요..
make파일 만들기 구차나서 그냥 알리아싱 해서 쓰고 있네여.. 전.. ㅋ
[/code]Do you think that's the air you are breathing now?
module programming
-> kernel source가 /usr/src/linux2-4 에 있을경우
cc -D__KERNEL__ -DMODULE -I/usr/src/linux-2.4/include -c file.c
로 해보시지요..
위에분 말씀대로 하니까 잘 돼네여
디바이스 드라이버를 공부하고자 하는데 쉬운책좀 소개해 주세요
이해도 못하면서 리눅스 디바이스 드라이버라는 오일리책을 읽었는데
무슨 말인지 하나도 모르겠더라고여 강좌와 예제 샘플이 나온곳도 추천해 주시면 감사하겠습니다. kldp에서 의외로 찾기 힘들더라고여
T.T 컴파일 성공해서 조아라 했더니만 이젠 등록이 안대네여 insm
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?
저두 커널 공부하고 있는데요..
저두 커널 공부하고 있는데요..
일반적으로 커널공부할때 만들어 보는 프로그램이 뭐가 있을까요?
드라이버라는 것이 하드웨어랑 맞물리는거라 특별한 하드웨어가 없는한 방향잡기가 힘든데
hello.c나 기본적인 구조를 파악했다 싶을때 개인 프로젝트로 뭐를 만들어 보면 좋을가요?
--
Linux강국 KOREA
http://ydongyol.tistory.com/
댓글 달기