디바이스 드라이버 컴파일 문제입니다.

plustag의 이미지

디바이스 드라이버를 만드는데 컴파일이 안되네요
read할때 랜덤한 값을 생성하는 건데 stdlib.h파일도 못읽고
에러가 생기네요..

어떻게 해야죠?

#include linux/kernel.h> #include linux/fs.h> #include linux/module.h> #include linux/init.h> #include asm/uaccess.h> #include stdlib.h>

#define Dev_name "divemod"

int divemod_major = 0;
int result;

int dive_init(void);
void clean_mod(void);

int dive_open(struct inode *inode, struct file *filp);
ssize_t dive_read(struct file *filp, void *buf, size_t count, loff_t *f_pos);
int dive_release(struct inode *inode, struct file *filp);

int dive_open(struct inode *inode, struct file *filp)
{
MOD_INC_USE_COUNT;
return 0;
}

int dive_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
return 0;
}

ssize_t dive_read(struct file *filp, void *buf, size_t count, loff_t *f_pos)
{
unsigned int buffer[4];

buffer[0] = rand() % 100; // Death
buffer[1] = rand() % 10 + 15; // water temp
buffer[2] = rand() % 3 + 35; // body heat
buffer[3] = rand() % 20 + 60; // heart rate

copy_to_user(buf, buffer, count);

return count;
}

struct file_operations dive_fops = {
.open = dive_open,
.release = dive_release,
.read = dive_read,
};

int dive_init(void)
{
result = register_chrdev(divemod_major, Dev_name, &dive_fops);
if(result < 0)
{
printk(KERN_WARNING "%s: can't get major %d\n",Dev_name, divemod_major);
return result;
}
return 0;
}

void clean_mod(void)
{
if(!unregister_chrdev(result, Dev_name))
printk("%s cleanup_module success...\n", Dev_name);
else
printk("%s cleanup_module fail...\n", Dev_name);
}

module_init(dive_init);
module_exit(clean_mod);

Makefile..

obj-m := divemod.o

KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

error message..

make -C /lib/modules/2.6.8-2-386/build SUBDIRS=/root/project/dd modules
make[1]: Entering directory `/usr/src/kernel-headers-2.6.8-2'
CC [M] /root/project/dd/divemod.o
/root/project/dd/divemod.c:1:20: stdlib.h: 그런 파일이나 디렉토리가 없음
/root/project/dd/divemod.c: In function `dive_open':
/root/project/dd/divemod.c:22: warning: `MOD_INC_USE_COUNT' is deprecated (declared at include/linux/module.h:555)
/root/project/dd/divemod.c: In function `dive_release':
/root/project/dd/divemod.c:28: warning: `MOD_DEC_USE_COUNT' is deprecated (declared at include/linux/module.h:567)
/root/project/dd/divemod.c: In function `dive_read':
/root/project/dd/divemod.c:36: warning: implicit declaration of function `rand'
/root/project/dd/divemod.c: At top level:
/root/project/dd/divemod.c:49: warning: initialization from incompatible pointer type
make[2]: *** [/root/project/dd/divemod.o] 오류 1
make[1]: *** [_module_/root/project/dd] 오류 2
make[1]: Leaving directory `/usr/src/kernel-headers-2.6.8-2'
make: *** [default] 오류 2

cwryu의 이미지

stdlib.h 못 씁니다.

당연히 C 라이브러리에 있는 건 못 쓰죠..

plustag의 이미지

그럼 가상으로 만든 저 디바이스 드라이버 안에서
read할때 랜덤한 값을 생성하게 하려면 어떻게 해야합니까?

커널 수준에서 제공하는 함수들이 있는지요??

누구냐 넌?

wariua의 이미지

'흔한 함정' 중 하나에 빠지셨군요 :) cwryu님 말씀 대로 커널 소스 내에선 glibc 라이브러리처럼 커널을 기반으로 동작하는 루틴을 사용할 수 없습니다. 온전히 커널 내에서 알아서 해결해야 하지요.

일단, 간단한 의사난수 생성 루틴을 작성하실 수 있습니다. "pseudo random generator" 정도로 검색하면 많은 관련 자료를 찾으실 수 있습니다. '적당한' 수준의 난수로 충분하다면 "이전 난수를 제곱하고 가운데 부분만 사용하기" 같은 기법을 사용하실 수도 있습니다.

'지대' 난수를 원하시면 ramdom 모듈의 get_ramdom_bytes() 함수를 사용하시면 됩니다. 간단한 루틴을 작성하기로 하신 경우 시드값을 얻어올 때만 이 함수를 사용하실 수도 있습니다.
----
$PWD `date`

$PWD `date`

plustag의 이미지

감사합니다.. 단서를 찾았네요..

누구냐 넌?

lovejin0309의 이미지

답변 달아 주신 분들 멋쟁이~

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.