Разработка драйвера ядра Linux - Как записать на устройство - PullRequest
0 голосов
/ 22 мая 2019

Я изучаю 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;
}
...