2011-06-22 24 views
1

理由(EFAULTでO_DIRECTの結果は)擬似コードの作業を以下のいないmmap入力メモリをO_DIRECT出力ファイルに書き込む方法は?

in_fd = open("/dev/mem"); 
in_mmap = mmap(in_fd); 
out_fd = open("/tmp/file", O_DIRECT); 
write(out_fd, in_mmap, PAGE_SIZE); 

次ながら行い(なしO_DIRECT)

in_fd = open("/dev/mem"); 
in_mmap = mmap(in_fd); 
out_fd = open("/tmp/file"); 
write(out_fd, in_mmap, PAGE_SIZE); 

私はそれが仮想ユーザーページへの仮想カーネルページで何かだと思いますこれは書き込み呼び出しでは変換できません。 O_DIRECTと

よろしく、MMAPを使用

フリードリヒ

+0

「O_DIRECT」の書き込みはページを固定する必要があります。多分それは問題です...あなたは実際に何をしようとしていますか?これがメモリマップされたハードウェアデバイスの場合は、ドライバに 'splice'サポートを追加する方が良いかもしれません...また、より完全な例(すべてのシステムコールのすべてのフラグを含む)を提供してください。理想的には誰でもコンパイルして再現することができます。 – Nemo

答えて

0

()トリッキーです。いくつかの制限があります。ファイルへの出力は、ブロック境界に合わせる必要があります。たとえば、mmap()のオフセットを0に設定すると、コードが機能します。その値を適切に設定するには、ファイルシステムのブロックサイズをチェックする必要があります。