Próbuję przydzielić trochę pamięci dla znaku * w następujący sposób.Jak mogę przydzielić pamięć w jądrze Linuxa na ciąg znaków typu 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;
}
„dane” jest zadeklarowana w pliku nagłówkowym jak
char *data;
Kiedy wywołać funkcję zapisu, „kmalloc upaść” linia nie zostanie osiągnięta, który prowadzi mnie do uwierzyć, że udało kmalloc jednak dane nie są wyświetlane, gdy ponownie spróbuję odczytać zmienną "data".
Co bardziej mylące, jeśli pozbywam się w całości kawałka kmalloc, dane można odczytać ze sterownika. Mimo to problem polega na tym, że następuje po nim ładunek innych danych, ponieważ nie mam możliwości jego wczytania().
Czy poprawnie używam kmalloc? Prawdopodobnie nie. Jak powinienem to robić?
Dodatkowo moja funkcja odczytu wygląda następująco.
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;
}
Dzięki.
Dzięki zarówno dla tych wielkich odpowiedzi, to naprawdę wielka pomoc! Oznaczałbym je obie jako wybraną odpowiedź, gdybym mógł, chociaż wybiorę kawiarnię, ponieważ zawierał blokadę i ma mniejszą reputację: p Jeszcze raz dziękuję! – cheesysam