2017-08-01 112 views
0

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

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 
} 

非常感谢帮助

回答

0

从你的问题,看来你期待的char * buf传递给你的show_dmaread功能点直接将用户空间缓冲区传递给read(或者至少已经用用户端缓冲区中的数据填充):

然而,在寻找Documentation/filesystem/sysfs.txt它说:

sysfs的分配大小(PAGE_SIZE)的缓冲器,并将其传递到 方法。每次读取或写入时,Sysfs都会调用该方法一次。这迫使以下行为的方法 实现:

  • 上阅读(2)中,显示()方法应该填满整个缓冲器。回想一下,一个属性只应该输出一个值,或者一个类似值的数组,所以这个值不会很贵。

    这允许用户空间随意地在整个文件上任意地执行部分读取和转发查找 。如果用户空间寻求回零或者执行偏移量为'0'的前导(2),那么show()方法将再次调用 以重新填充缓冲区。

这使我相信你得到一个新分配的缓冲区和其他一些内核代码管理回过复制你的缓冲到用户空间。

+0

非常感谢你,我现在明白,但仍然无法访问自动分配的缓冲区。我可以在函数show fill it中打开它的值来访问它,但是show函数完成后,我找不到任何解决方案如何在用户空间访问它。 – Nuke