Comment puis-je allouer de la mémoire dans le noyau Linux pour un char* type de chaîne?

Je suis en train d'allouer de la mémoire pour un char* comme suit.

static ssize_t memo_write(struct file *filp, const char __user *buf, 
   size_t count, loff_t *f_pos){
    ssize_t retval = -ENOMEM;
    printk("write function\n");

    if((data = kmalloc(strlen(buf), GFP_KERNEL)) == NULL)
        printk("kmalloc fail\n");

    if(copy_from_user(data, buf, strlen(buf))){
        retval = -EFAULT;
        goto out;
    }
    *f_pos += strlen(buf);
    retval = strlen(buf);

    out:
        return retval;
}

"data" est déclarée dans un fichier d'en-tête comme

char *data;

Lorsque j'appelle la fonction d'écriture, le "kmalloc l'échec de la ligne n'est pas atteint, ce qui m'amène à croire que le kmalloc réussi, cependant, les données ne sont pas affichées lorsque je tente de lire à partir de la "data" variable de nouveau.

Plus de prêter à confusion, si je me débarrasser de la kmalloc bits au total, les données peuvent être lues à partir du pilote. Bien que le problème est ensuite elle est suivie par la charge des autres données car je n'ai pas la possibilité de memset() il.

Suis-je à l'aide de kmalloc correctement? Sans doute pas. Comment dois-je faire cela?

De plus, ma fonction de lecture est comme suit.

static ssize_t memo_read(struct file *f, char __user *buf, 
    size_t count, loff_t *f_pos){
    ssize_t retval = 0;

    printk("read function\n");
    printk("data = %s\n", data);

    if(*f_pos >= strlen(data)){
        printk("EOF\n");
        goto out;
    }

    if(copy_to_user(buf, data, strlen(data))){
        retval = -EFAULT;
        goto out;
    }
    printk("copy_to_user success\n");
    *f_pos += strlen(data);
    retval = strlen(data);
    out:
        return retval;
}

Grâce.

  • Merci pour ces deux grandes réponses, c'est vraiment d'une grande aide! J'avais marquer à la fois comme la réponse choisie si je pouvais, même si je vais prendre la caf parce qu'il/elle verrouillage fourni et a moins de réputation :p Merci encore!
InformationsquelleAutor cheesysam | 2010-01-20