Estoy tratando de asignar algo de memoria para un char * de la siguiente manera.¿Cómo puedo asignar memoria en el kernel de Linux para una cadena tipo * char *?
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;
}
'datos' se declara en un archivo de cabecera como
char *data;
Cuando llamo a la función de escritura, el 'kmalloc fracasar' no se alcanza la línea, lo que me lleva a creer que el éxito kmalloc Sin embargo, los datos no se muestran cuando intento leer de nuevo la variable 'datos'.
Más confuso, si me deshago de la bit de kmalloc por completo, los datos se pueden leer desde el controlador. Aunque el problema es seguido por una carga de otros datos porque no tengo la oportunidad de memset().
¿Estoy usando kmalloc correctamente? Presumiblemente no. ¿Cómo debería estar haciendo esto?
Además, mi función de lectura es la siguiente.
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;
}
Thanks.
Gracias tanto para estos grandes respuestas, es realmente una gran ayuda! Los marcaría como la respuesta elegida si pudiera, aunque elegiré café porque incluyó el bloqueo y tiene menos reputación: p ¡Gracias de nuevo! – cheesysam