我想为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