ioctl()、unlocked_ioctl()およびcompat_ioctl()の違いは何ですか?


38

lxr.linux.noにあるlinux 2.6.36のソースコードを調べてみると、このioctl()メソッドが見つかりませんでしたfile_operations。代わりに、2つの新しい呼び出しを見つけました:unlocked_ioctl()compat_ioctl()。どのような違いがあるioctl()unlocked_ioctl()compat_ioctl()

回答:


39

メタ回答:Linuxカーネルで発生するすべての未処理はlkml(Linuxカーネルメーリングリスト)を通過しますわかりやすい要約については、lwn(Linux週刊ニュース)を読むか検索してください

回答:Jonathan Corbetによるioctl()の新しい方法から:

ioctl()Big Kernel Lock(BKL)の下で実行されるカーネルの残りの部分の1つです。過去には、BKLを使用することで、長時間実行されるioctl()メソッドが無関係なプロセスの長いレイテンシーを作成することが可能になりました。

導入されたパッチの説明は次のunlocked_ioctlcompat_ioctl2.6.11にします。フィールド削除は、ioctl 2.6.36でかなり後で発生しました。

説明:ioctl実行されたとき、Big Kernel Lock(BKL)を使用したため、同時に実行できるものはありませんでした。これはマルチプロセッサマシンでは非常に悪いため、BKLを削除するための多大な努力がありました。まず、unlocked_ioctl導入されました。各ドライバー作成者は、代わりに使用するロックを選択できます。これは困難な場合があるため、古いドライバーがまだ動作している(を使用ioctl)が、新しいドライバーが改善されたインターフェースを使用できる移行期間がありました(unlocked_ioctl)。最終的にすべてのドライバーが変換され、ioctl削除できました。

compat_ioctl同時に追加されたにもかかわらず、実際には無関係です。その目的は、32ビットのユーザーランドプログラムがioctl64ビットカーネルで呼び出しを行えるようにすることです。最後の引数の意味はioctlドライバーに依存するため、ドライバーに依存しない変換を行う方法はありません。


1
私は最新のioctlソースを見ていましたが、syscallがいくつかのチェックを行ってからここにジャンプするのを見ました。ioctlシステムの詳細情報をどこで収集できるか知っていますか?文字ファイルのioctlコマンドが適切なドライバーにルーティングされる方法に興味があります。unlocked_ioctlこれが起こるのはそれを通してですか?関数ポインタがファイルごとに使用されているという事実(この場合はa struct file)に近いかもしれません。されたunlocked_ioctl後、ドライバの初期化時に文字ファイルに登録さmknod
sherrellbc

1
@sherrellbcデバイスドライバは、次のような方法扱うファイル登録unlocked_ioctlではstruct file_ops、起動時、それらはから移入されたstruct file_opsファイルを開いたときにファイルオブジェクトに。mknodこれには何の役割も果たしません。
ジル 'SO-悪であるのをやめる'

そうですか。デバイスドライバーはmknod、関連するファイル操作を(経由でunlocked_ioctl)リダイレクトする前に、まずキャラクターデバイスを介してインターフェイスを公開する必要があると考えていました。
sherrellbc

4

カーネル2.6.36の(include / linux / fs.h)struct file_operationsメソッドioctl()のcompat_ioctl()への置換が機能しない場合があり(一部のデバイスドライバーの場合)、unlocked_ioctl()を使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.