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_ioctl
2.6.11にします。フィールドの削除は、ioctl
2.6.36でかなり後で発生しました。
説明:ioctl
実行されたとき、Big Kernel Lock(BKL)を使用したため、同時に実行できるものはありませんでした。これはマルチプロセッサマシンでは非常に悪いため、BKLを削除するための多大な努力がありました。まず、unlocked_ioctl
導入されました。各ドライバー作成者は、代わりに使用するロックを選択できます。これは困難な場合があるため、古いドライバーがまだ動作している(を使用ioctl
)が、新しいドライバーが改善されたインターフェースを使用できる移行期間がありました(unlocked_ioctl
)。最終的にすべてのドライバーが変換され、ioctl
削除できました。
compat_ioctl
同時に追加されたにもかかわらず、実際には無関係です。その目的は、32ビットのユーザーランドプログラムがioctl
64ビットカーネルで呼び出しを行えるようにすることです。最後の引数の意味は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
?