前回投稿した「Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバで紹介したudmabufに read() と write() を追加しました。
当初は mmap() だけ出来れば良いだろうと思ってました。
しかし、CやC++でプログラミングする場合は良いのですが、Ruby等のスクリプト言語からmmap()を使うのは面倒そうです。
そこで、単純に read() と write() が出来るようにしました。
read()、write()が出来るので、次のように dd コマンドを使って直接ファイルからコピーできるようになります。
zynq$ dd if=/dev/urandom of=/dev/udmabuf0 bs=4096 count=1024
1024+0 records in
1024+0 records out
4194304 bytes (4.2 MB) copied, 3.07516 s, 1.4 MB/s
zynq$dd if=/dev/udmabuf4 of=random.bin
8192+0 records in
8192+0 records out
4194304 bytes (4.2 MB) copied, 0.173866 s, 24.1 MB/s
read() と write() ではユーザー空間上のバッファとDMAバッファとの間でデータのコピーを行います。
そのため、mmap()を使ってDMAバッファをマッピングして直接アクセスするのに比べて時間がかかります。
また、キャッシュの制御の関係上、mmap()との併用は何が起こるかまだ判らないので推奨しません。