2012-06-20 48 views
5

ioctlをLinuxカーネルモジュールから呼び出すことはできますか? 誰がどのように使用されているかの例を提供できますか?Linuxのカーネル空間からioctl()を使用するには?

+3

あなたは本当にそのようなことをするつもりはありません。検索を行うと、カーネル空間内から任意のシステムコールを行う方法の実装依存のコードがいくらか見つかりますが、実際の目的を達成する方法があるかどうかを考えてください。 –

答えて

5

sys_ioctlに電話することができます。
カーネルをCONFIG_COMPATでコンパイルするとエクスポートされます。

また、デバイスドライバのstruct file_operationsがある場合は、ioctlハンドラを直接呼び出すことができます。

しかし、ioctlハンドルは、カーネルアドレス空間ではなく、現在実行中のプロセスのアドレス空間にポインタパラメータがあることを期待しています。 copy_from_userがそれらを読み取るために使用されます。カーネルアドレス空間へのポインタを与えると、copy_from_userは失敗します。私はあなたがこれを回避する方法を見ていない。

編集:

あなたが失敗することはありませんcopy_from_userよりも、コードの下の間のioctlハンドラが呼び出されます場合。

mm_segment_t fs; 

    fs = get_fs();  /* save previous value */ 
    set_fs (get_ds()); /* use kernel limit */ 

    /* system calls can be invoked */ 

    set_fs(fs); /* restore before returning to user space */ 
+1

file_operationsのioctlハンドラは推奨されていません。あなたはioctlを使う新しい方法を理解できますか? – iammurtaza

+0

get_fs()とset_fs()がカーネルスペースがシステムコールを実行することを魔法のように許可する方法と、この "copy_from_user()"がもはや問題を生成しなくなった後の仕方を詳しく説明できますか? –

+0

'set_fs'は、' copy_to_user'に渡されたアドレスが実際に現在のユーザのアドレス空間にあることを検証するメカニズムに影響します。カーネルは、現在のアドレス空間がカーネルアドレス空間であると考えさせます。 – ugoren

関連する問題