Linux kernel 将_复制到_每个用户的非工作数据从列表_中获取

Linux kernel 将_复制到_每个用户的非工作数据从列表_中获取,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正试图根据以下示例开发驱动程序: Linux 3.13 x86_64 如果printk有可用的信息,则无法复制 给定读取调用的快照: /* private data */ struct _mydrv_data{ struct list_head list; /*link list*/ char info[10]; /* info */ }; LIST_HEAD( mydrv_list); /*list head*/ int read_proc(struct file *f

我正试图根据以下示例开发驱动程序:

Linux 3.13 x86_64

如果printk有可用的信息,则无法复制

给定读取调用的快照:

/* private data */
struct _mydrv_data{
    struct list_head list; /*link list*/
    char info[10];  /* info */
};

LIST_HEAD( mydrv_list); /*list head*/

int read_proc(struct file *filp, char __user *buf,    
                size_t count, loff_t *offp)
{

off_t thischunk_len = 0;
struct _mydrv_data *p;
int ret = 0;
//traverse the list and copy info into buf

list_for_each_entry(p, &mydrv_list, list){
    ret = copy_to_user(buf, p->info, strlen(p->info));
    printk(KERN_DEBUG "ret:%d read proc %s",ret,p->info);

    thischunk_len += strlen(p->info);
    buf += thischunk_len;
    if (count == 0 )
        return thischunk_len;
    count-= thischunk_len;
    }


return thischunk_len;
}

感谢

copy\u to\u用户返回一个结果,成功后无法复制的字节数为零。但是您正在悄悄地放弃该结果。copy_to_user返回“0”,即所有字节都被复制。顺便说一句,如果我将printk移到copy_to_user下面,我会得到输出cat/proc/readme,并保持从1号节点到15号节点的旋转。但是其他的则不可见,尽管dmesg日志显示它已经将所有数据写入了节点99。为什么循环没有中断,为什么我看不到99号节点之前的所有节点。所以复制到用户是成功的。您正在复制的字节数为strlenp->info,这意味着您没有复制终止的'\0'空字符。尝试在循环中添加此项:printkKERN\u调试计数=%zu\n,计数;。循环仅在计数为零时终止;我不知道它是否跳过了0。@Keith,count跳过了0,重置为65536-1。1由于循环只有大约100个长度的元素,例如11号节点,总大小约为1100字节,因此只有api的列表_应该退出。2 count==0检查仅用于故障保护我正指望for循环退出