Я изучаю Kernel dev для Linux и всегда выбираю проект для изучения разработки.
Я хочу создать драйвер, который будет принимать вводимые данные и записывать их в журнал или выводить их.IE echo "FOOBAR"> / dev / hello
Я создал устройство в / dev / hello.У меня есть функция, которая вызывается, когда устройство записывается в него, и действует странно.Мне кажется, что память не очищена правильно, и memset, кажется, не имеет никакого эффекта.
Странный вывод
May 22 20:59:20 codeM kernel: [ 3541.839497] I was assigned major number 510
May 22 20:59:20 codeM kernel: [ 3541.839500] Please create device with name
May 22 20:59:20 codeM kernel: [ 3541.839500] mknod /dev/hello c 510 0
May 22 20:59:43 codeM kernel: [ 3565.604818] DATA: ZZZZZZZZZ
May 22 20:59:43 codeM kernel: [ 3565.604818] t-check is�
May 22 20:59:43 codeM kernel: [ 3565.604818]
May 22 20:59:43 codeM kernel: [ 3565.604829] I am Sorry Dave, But I cannot Let you do that !
Вот мой код:
#include "functs.h"
MODULE_LICENSE("GPL");
#define DRIVER_AUTHOR "projecter"
#define DRIVER_DESC "Some echo driver"
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
int Major;
static int Device_Open = 0;
static char msg[BUF_LEN];
static char *msg_Ptr;
static struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
//init _module functions
int init_module(void){
Major = register_chrdev(0, DEVICE_NAME, &fops);
if (Major < 0){
printk(KERN_ALERT "I have failed to load!\n");
return Major;
}
printk (KERN_ALERT "I was assigned major number %d\n" , Major);
printk (KERN_ALERT "Please create device with name \n mknod /dev/%s c %d 0 \n" ,DEVICE_NAME , Major );
return 0;
}
int device_open(struct inode * inode, struct file *file){
static int counter = 0;
if (Device_Open){
return -EBUSY;
}
Device_Open++;
sprintf(msg, "Good morning Dave, I was opened %d times", counter++);
msg_Ptr = msg;
try_module_get(THIS_MODULE);
return 0;
}
int device_release(struct inode * inode, struct file *file){
Device_Open--;
module_put(THIS_MODULE);
return 0;
}
ssize_t device_read(struct file * file, char * buffer, size_t length, loff_t *offset){
int bytes_read = 0;
if(*msg_Ptr == 0){
return 0;
}
while(length && *msg_Ptr){
put_user(* (msg_Ptr++), buffer++ );
length--;
bytes_read++;
}
return bytes_read;
}
char temp_str[20] = {};
ssize_t device_write(struct file * file , const char * buffer, size_t length, loff_t *offset){
static int MAX = 20;
if (buffer){
if(copy_from_user(temp_str, buffer , MAX) !=0 ){
return -EFAULT;
}
else{
printk(KERN_ALERT "DATA: %s \n\n", temp_str);
}
}
printk(KERN_ALERT "I am Sorry Dave, But I cannot Let you do that !\n");
memset(temp_str, 0, 20);
return 1 ;
// return -EINVAL;
}