디바이스 드라이버 컴파일 문제입니다.
디바이스 드라이버를 만드는데 컴파일이 안되네요
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
stdlib.h 못
stdlib.h 못 씁니다.
당연히 C 라이브러리에 있는 건 못 쓰죠..
그럼 가상으로 만든
그럼 가상으로 만든 저 디바이스 드라이버 안에서
read할때 랜덤한 값을 생성하게 하려면 어떻게 해야합니까?
커널 수준에서 제공하는 함수들이 있는지요??
누구냐 넌?
'흔한 함정' 중
'흔한 함정' 중 하나에 빠지셨군요 :) cwryu님 말씀 대로 커널 소스 내에선 glibc 라이브러리처럼 커널을 기반으로 동작하는 루틴을 사용할 수 없습니다. 온전히 커널 내에서 알아서 해결해야 하지요.
일단, 간단한 의사난수 생성 루틴을 작성하실 수 있습니다. "pseudo random generator" 정도로 검색하면 많은 관련 자료를 찾으실 수 있습니다. '적당한' 수준의 난수로 충분하다면 "이전 난수를 제곱하고 가운데 부분만 사용하기" 같은 기법을 사용하실 수도 있습니다.
'지대' 난수를 원하시면 ramdom 모듈의 get_ramdom_bytes() 함수를 사용하시면 됩니다. 간단한 루틴을 작성하기로 하신 경우 시드값을 얻어올 때만 이 함수를 사용하실 수도 있습니다.
----
$PWD `date`
$PWD `date`
감사합니다.. 단서를
감사합니다.. 단서를 찾았네요..
누구냐 넌?
답변 달아 주신 분들
답변 달아 주신 분들 멋쟁이~
댓글 달기