2011-10-15 4 views
3

http://www.kernel.org/doc/htmldocs/kernel-hacking.html#routines-copyこの機能は "眠る"ことができます。Linuxカーネルのcopy_ [to/from] _user()のロック

この機能を使用する場合、または例外が発生する場合は常にロックする必要がありますか(たとえば、mutexなど)

私は現在、モジュールで作業していて、自分のシステムでいくつかのKernel Oopsを見ましたが、それらを再現することはできません。私は現在、copy_ [to/from] _user()の周りにロックしていないので、彼らが解雇されたと感じています。たぶん私は間違っていますが、それはそれと関係があるようなにおいがします。

私のようなものがあります:

static unsigned char user_buffer[BUFFER_SIZE]; 
static ssize_t mcom_write (struct file *file, const char *buf, size_t length, loff_t *offset) { 
    ssize_t retval; 
    size_t writeCount = (length < BUFFER_SIZE) ? length : BUFFER_SIZE; 
    memset((void*)&user_buffer, 0x00, sizeof user_buffer); 
    if (copy_from_user((void*)&user_buffer, buf, writeCount)) { 
     retval = -EFAULT; 
     return retval; 
    } 
    *offset += writeCount; 
    retval = writeCount;   
    cleanupNewline(user_buffer);  
    dispatch(user_buffer); 
    return retval; 
} 

は、これがそうすることを保存したり、copy_from_userが実行されている間、私は、他のアクセスからそれをロックする必要があるんですか?

これは読み書き元のcharデバイスです。ネットワーク内の特別なパケットが受信された場合、このバッファに同時にアクセスすることができます。

答えて

2

あなたがコピーしているカーネル側のデータ構造が消えてしまうかもしれないならば、ロックをする必要がありますが、そのデータ構造はロックを取るべきです。

+0

こんにちは、ありがとう、私はあなたが何を意味していると思う、上記の私のコードを見て、これは大丈夫ですか教えてください、私はちょうどローカルバッファに書き込みます。ですから、もし私が正しいなら、私のcopy_from_usersがデータ構造へのアクセス権を持っている限り、他の読み取り/書き込みからバッファを保護する必要があります。 – evildead

+0

@evildead:バッファは静的なので、離れていく心配はありませんが、他のカーネルコードがそのバッファに同時にアクセスできる場合は、バッファが矛盾していないことを確認するためにロックする必要があります状態。 – caf

+0

清算のためのthx – evildead

1

私はあなたの関数を推測していますmcom_writeはprocfsの書き込み関数(または同様の)ですか?その場合、procfsファイルにプログラムがブロックされている可能性があります。がを返すまで、copy_[to/from]_userがスリープしても、プログラムはバッファを変更しません。

あなたのプログラムがどのように動作しているかを明記していないので、何も言い難いです。あなたのプログラムがマルチスレッドで、あるスレッドが他のスレッドがデータを変更できる間に書き込みを行う場合は、ロックが必要ですが、ユーザスペースプログラムのスレッド間ではカーネルモジュールではありません。

スレッドの書き込みが1つの場合は、mcom_writeが終了するまでロックされ、ロックは必要なくなり、問題は他の場所にあります(ただし、この機能に間違いがない限り、 copy_from_userではありません)

+0

私はちょっとこれに新しいです。私の思うprocfsのものではなく、/ devの下の単なるcharデバイスです。そして私は、ユーザーとカーネルの空間から、そのデータ構造に同時にアクセスします。 (ネットワーク上のパケットが表示された場合は、ハード_ソフトキーが起動されます)、この機能はジャンプしてデータを変更することができます。 – evildead

+0

私はユーザー空間からJava(scala)にあり、RandomAccessFileというデータ型を使用します。 charデバイスが別のスレッドimhoによって開かれている場合はブロックしませんが、Java内からcharデバイスにアクセスする唯一の方法だと思っていますが、RandomAccessFileが正しく動作していることがわかりました。とにかく、同時にネットワーク割り込みからカーネルに同時にアクセスすることもできます。 – evildead

+1

procfsと/ devデバイスは類似していますが、何かを明確にする必要があります。ファイルに書き込むときは、書き込み元のバッファがあります。たとえば、データ構造がいくつかある場合、それらのデータを含む文字列を作成し、その文字列はデータ構造のコピーであり、他のものが構造を変更した場合、その文字列(ファイルへの書き込み用のバッファ)は変化する。したがって、ロックは必要ありません。データ構造から直接書き込む場合は、ロックを確実に行う必要があります。 – Shahbaz