2017-08-01 4 views
0

私はPCI経由でDMAを提供しようとしています。そのために私はsysfsドライバの例を持っています。私はRAMにデータを保存しましたが、残念ながら私はそれらを読みません。私は関数store_dmareadとshow_dmareadを持っています。私はこのようなCコードでアクセスします。書き込み関数は正常に動作しますが、read()で開いたshow関数は動作しますが(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); 

関数は次のようになります。あなたの質問から助け

答えて

0

ため

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 
} 

おかげで多くのことを、あなたがchar * bufあなたshow_dmareadファンクションポイントに渡すことを期待している表示されますreadに渡されたユーザ空間バッファに直接渡されます(または、少なくともユーザ側のバッファにデータが格納されています)。

しかし、Documentation/filesystem/sysfs.txtに見たことは言う:

SYSFSのサイズ(PAGE_SIZE)のバッファを割り当て、 メソッドに渡します。 Sysfsは、それぞれの読み取りまたは の書き込みに対してメソッドを1回だけ呼び出します。これは、メソッドに次の動作を強制 実装:読むには

  • (2)、show()メソッドは、バッファ全体を埋める必要があります。属性は1つの値、または
    の類似の値の配列のみをエクスポートする必要があることを想起してください。

    これにより、ユーザー空間で部分的な読み込みを実行し、任意の場所でファイル全体に任意に を転送することができます。ユーザ空間が に戻ったり、オフセットが '0'のプレアド(2)がある場合、show()メソッドは再度呼び出され、バッファを満たすために再起動されます。あなたが新たに割り当てられたバッファを取得し、他のいくつかのカーネルコードは、ユーザ空間に戻るの上にバッファをコピーし管理していることをされていると信じて私をリード

+0

ありがとう、今私は理解していますが、私は自動的に割り当てられたバッファにアクセスできません。 show関数でその値にアクセスし、その値を表示することができますが、show関数が終了した後は、ユーザー空間でどのようにアクセスするかを見つけることができません。 – Nuke

関連する問題