我想爲char *分配一些內存,如下所示。如何在Linux內核中爲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;
}
「數據」被宣佈在頭文件作爲
char *data;
當我調用write功能,「kmalloc的失敗,」沒有達到線,這使我相信,成功的kmalloc ,但是當我嘗試再次讀取'data'變量時,數據不會顯示。
更令人困惑的是,如果我完全擺脫了kmalloc位,可以從驅動程序讀取數據。雖然問題在於後面是其他數據的加載,因爲我沒有機會memset()它。
我是否正確使用kmalloc?大概不會。我應該怎麼做?
此外,我的閱讀功能如下。
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;
}
謝謝。
既感謝這些偉大的答案,這是真的有很大的幫助!如果可以的話,我會把它們都標記爲所選的答案,但我會選擇咖啡因爲他/她包括鎖定並且聲譽較低:p 再次感謝! – cheesysam 2010-01-20 12:33:36