BIN_ATTR_RW(name,2*PAGE_SIZE) ,name_read(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t)参数size_t显示大小为PAGE_SIZE,是用户空间提供的buf大小,用户空间每次最多只copy PAGE_SIZE大小直到loff_t是2*PAGE_SIZE为止,那name_read函数怎么写才能保证大于PAGE_SIZE的数据都能cat出来?
时间: 2024-02-27 08:53:05 浏览: 24
要保证大于PAGE_SIZE的数据都能cat出来,可以在name_read函数中使用循环来读取数据。具体来说,每次循环读取PAGE_SIZE大小的数据,直到读取到数据的长度小于PAGE_SIZE为止。
以下是示例代码:
```
static ssize_t name_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *attr, char *buf,
loff_t pos, size_t size)
{
ssize_t ret = 0;
size_t len = 0;
while (len < size) {
size_t read_size = min_t(size_t, PAGE_SIZE, size - len);
char *page = (char *)get_zeroed_page(GFP_KERNEL);
if (!page) {
ret = -ENOMEM;
break;
}
/* read data from device */
ret = read_data_from_device(page, pos + len, read_size);
if (ret <= 0) {
break;
}
/* copy data to user space */
if (copy_to_user(buf + len, page, ret)) {
ret = -EFAULT;
break;
}
len += ret;
free_page((unsigned long)page);
}
return (ret >= 0) ? len : ret;
}
```
在该函数中,使用了while循环来读取数据,并且每次读取PAGE_SIZE大小的数据。如果读取到的数据长度小于PAGE_SIZE,则表示已经读取完了所有数据,退出循环。在读取到的数据中,使用copy_to_user函数将数据复制到用户空间的buf中。同时,每次读取完成后,需要释放内存。