从sysfs读取数据

时间:2017-08-01 20:27:38

标签: drivers sysfs

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

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);

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

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
}

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

根据您的问题,您似乎期望传递给char * buf函数的show_dmaread直接指向传递给read的用户空间缓冲区(或者至少已填充)使用用户端缓冲区中的数据):

然而,查看Documentation/filesystem/sysfs.txt它说:

  

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

     
      
  • 在read(2)上,show()方法应该填满整个缓冲区。回想一下,属性应该只导出一个值或一个
      类似值的数组,所以这不应该那么贵。

         

    这允许用户空间进行部分读取和转发搜索   随意地遍历整个文件。如果用户空间寻求回归   零或者pread(2)的偏移量为'0',show()方法会   再次被召唤,重新召唤,以填补缓冲区。

  •   

这让我相信你正在获得一个新分配的缓冲区,而其他一些内核代码则管理将你的缓冲区复制回用户空间。