2017-08-01 68 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