首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从sysfs读取数据

从sysfs读取数据
EN

Stack Overflow用户
提问于 2017-08-01 20:27:38
回答 1查看 5.5K关注 0票数 0

我试图通过PCI提供DMA。为此,我有一个sysfs驱动程序的例子。我成功地将数据存储到RAM中,但不幸的是,我无法读取它们。我有一个函数store_dmaread和show_dmaread。我像这样通过c代码访问它们。写函数工作良好,但我通过read()打开的show函数工作(读取DMA数据,打印它们),但用户空间缓冲区在该函数中不可见。

代码语言:javascript
复制
char buf[2] = {3,3};
fw = open("/sys/bus/pci/devices/0000\:01\:00.0/dmaread", O_RDWR);
read (fw,buf, 2);
write (fw, buf, 2);
close(fw);

驱动程序中的函数如下所示:

代码语言:javascript
复制
static ssize_t show_dmaread(struct device *dev, struct device_attribute *attr, char *buf)
{
    printk("User space buffer value %d \n", buf[0]) // PRINTS 0
    // MORE CODE WHICH WORKS
}
static ssize_t store_dmaread(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
    // WORKS FINE THE ATTRIBUTE CHANGES ITS VALUE
}

非常感谢你的帮助

EN

回答 1

Stack Overflow用户

发布于 2017-08-01 20:51:46

从您的问题中可以看出,您期望char * buf直接传递给您的show_dmaread功能点到传递给read的用户空间缓冲区(或者至少已经填充了用户端缓冲区中的数据):

然而,在文档/文件系统/sysfs.txt中,它说:

sysfs分配一个大小缓冲区(PAGE_SIZE)并将其传递给该方法。Sysfs将为每次读或写精确调用一次该方法。这在方法实现上强制执行以下行为:

  • 在read(2)上,show()方法应该填充整个缓冲区。回想一下,属性应该只导出一个值,或者 类似值的数组,所以这不应该那么昂贵。 这允许用户空间任意对整个文件进行部分读取和转发。如果userspace寻求返回到零,或者做一个偏移量为'0‘的扩展(2),那么show()方法将再次被调用,重新武装,以填充缓冲区。

这使我相信您正在获得一个新分配的缓冲区,并且其他一些内核代码将您的缓冲区复制回用户空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45449571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档