lxr.linux.noにあるlinux 2.6.36のソースコードを調べてみると、このioctl()メソッドが見つかりませんでしたfile_operations。代わりに、2つの新しい呼び出しを見つけました:unlocked_ioctl()とcompat_ioctl()。どのような違いがあるioctl()、unlocked_ioctl()とcompat_ioctl()?
lxr.linux.noにあるlinux 2.6.36のソースコードを調べてみると、このioctl()メソッドが見つかりませんでしたfile_operations。代わりに、2つの新しい呼び出しを見つけました:unlocked_ioctl()とcompat_ioctl()。どのような違いがあるioctl()、unlocked_ioctl()とcompat_ioctl()?
回答:
メタ回答:Linuxカーネルで発生するすべての未処理はlkml(Linuxカーネルメーリングリスト)を通過します。わかりやすい要約については、lwn(Linux週刊ニュース)を読むか検索してください。
回答:Jonathan Corbetによるioctl()の新しい方法から:
ioctl()Big Kernel Lock(BKL)の下で実行されるカーネルの残りの部分の1つです。過去には、BKLを使用することで、長時間実行されるioctl()メソッドが無関係なプロセスの長いレイテンシーを作成することが可能になりました。
導入されたパッチの説明は次のunlocked_ioctlとcompat_ioctl2.6.11にします。フィールドの削除は、ioctl 2.6.36でかなり後で発生しました。
説明:ioctl実行されたとき、Big Kernel Lock(BKL)を使用したため、同時に実行できるものはありませんでした。これはマルチプロセッサマシンでは非常に悪いため、BKLを削除するための多大な努力がありました。まず、unlocked_ioctl導入されました。各ドライバー作成者は、代わりに使用するロックを選択できます。これは困難な場合があるため、古いドライバーがまだ動作している(を使用ioctl)が、新しいドライバーが改善されたインターフェースを使用できる移行期間がありました(unlocked_ioctl)。最終的にすべてのドライバーが変換され、ioctl削除できました。
compat_ioctl同時に追加されたにもかかわらず、実際には無関係です。その目的は、32ビットのユーザーランドプログラムがioctl64ビットカーネルで呼び出しを行えるようにすることです。最後の引数の意味はioctlドライバーに依存するため、ドライバーに依存しない変換を行う方法はありません。
unlocked_ioctlではstruct file_ops、起動時、それらはから移入されたstruct file_opsファイルを開いたときにファイルオブジェクトに。mknodこれには何の役割も果たしません。
mknod、関連するファイル操作を(経由でunlocked_ioctl)リダイレクトする前に、まずキャラクターデバイスを介してインターフェイスを公開する必要があると考えていました。
カーネル2.6.36の(include / linux / fs.h)struct file_operationsメソッドioctl()のcompat_ioctl()への置換が機能しない場合があり(一部のデバイスドライバーの場合)、unlocked_ioctl()を使用する必要があります。
unlocked_ioctlこれが起こるのはそれを通してですか?関数ポインタがファイルごとに使用されているという事実(この場合はastruct file)に近いかもしれません。されたunlocked_ioctl後、ドライバの初期化時に文字ファイルに登録さmknod?