2016-05-25 10 views
2

私は関数の実装とLinuxのファイルシステムを持っている:function-handlerでwrite関数のユーザ空間バッファを直接使用してメモリを節約する(Linux、Kernel)?

ssize_t (*write) (struct file *file, const char __user *buffer, size_t count, loff_t *pos); 

は、今の私は(機能ハンドリング以内)パリティを計算するために、バッファのデータを使用したいとしましょう。 私は

copy_from_user(void *to, const void __user *from, unsigned long n) 

を使用することができますしかし、問題は、私が最初に私のカーネル空間ポインタにメモリを割り当てる必要があるということです。コピーしたいデータの量は最大です。約7.5 MBおよび分。 512KB。私がkmallocを使ってカーネルにメモリを割り当てると、メモリプールに十分なメモリが割り当てられない可能性もあります。なぜなら何とか失敗するからです。

私はちょうど私のコードのユーザー空間からのポインタ?

... 
    *(dest) ^= *(buf); 
... 

これまでのところ、(小さいメモリ領域でも)動作するようです。 メモリマッピングの仕組みがわかりません。ユーザー空間のメモリが連続していない可能性がありますか?スワップアウトすることもできますか?危険とは何ですか?どうも!

+0

の可能性のある重複した[Linuxカーネルからユーザー空間のメモリにアクセスする方法?](http://stackoverflow.com/questions/10509850/how-to-access-user-space-memory-from-the -linux-kernel) –

答えて

1

ユーザ空間メモリは、いかなる場合でも直接使用しないでください。

あなたのタスクは、ユーザデータのストリーム処理として表現することができる場合には、収容全体のユーザーデータを一度のカーネルメモリを割り当てる必要はありません。

小さいサイズのメモリ(例えば4KB)を割り当て、最初のチャンクをその中に(copy_from_userを使用して)読み込み、処理し、次のチャンクを同じカーネルメモリに読み込み、処理するなどで十分です。

void* dest = kmalloc(4096, GFP_KERNEL); // or use __get_free_pages() 
while(count > 0) 
{ 
    int size = count >= 4096? 4096: count; 
    copy_from_user(dest, buffer, size); 
    <process-data-in-dest> 
    count -= size; 
    buffer += size; 
} 
関連する問題