lxr.linux.no でLinux 2.6.36ソースコードを調べたところ、_file_operations
_にioctl()
メソッドが見つかりませんでした。代わりに、2つの新しい呼び出しunlocked_ioctl()
とcompat_ioctl()
が見つかりました。 ioctl()
、unlocked_ioctl()
、compat_ioctl()
の違いは何ですか?
メタ答え:Linuxカーネルに発生するすべての生のことは lkml(Linuxカーネルメーリングリスト) を経由します。説明的な要約については、読み取りまたは検索 lwn(Linux weekly news) を検索してください。
回答:From ioctl()の新しい方法Jonathan Corbet による:
ioctl()
は、ビッグカーネルロック(BKL)の下で実行されるカーネルの残りの部分の1つです。以前は、BKLを使用することで、長時間実行するioctl()
メソッドで、関連のないプロセスに対して長いレイテンシを作成できるようになりました。
2.6.11にunlocked_ioctl
およびcompat_ioctl
を導入したパッチの説明に従います。 ioctl
フィールドの削除 は、2.6.36のかなり後で発生しました。
説明:ioctl
が実行されたとき、それは Big Kernel Lock (BKL)を要したため、他に何も同時に実行できませんでした。これはマルチプロセッサマシンでは非常に悪いので、BKLを取り除くために大きな努力が払われました。最初に、unlocked_ioctl
が導入されました。これにより、各ドライバー作成者は代わりに使用するロックを選択できます。これは難しい場合があるため、古いドライバーは(ioctl
を使用して)引き続き機能する移行期間がありましたが、新しいドライバーは改善されたインターフェイス(unlocked_ioctl
)を使用できました。最終的にすべてのドライバが変換され、ioctl
を削除できました。
compat_ioctl
は同時に追加されましたが、実際には無関係です。その目的は、32ビットのユーザーランドプログラムが64ビットのカーネルでioctl
を呼び出せるようにすることです。 ioctl
の最後の引数の意味はドライバーによって異なるため、ドライバーに依存しない変換を行う方法はありません。
カーネル2.6.36の(include/linux/fs.h)struct file_operationsメソッドioctl()からcompat_ioctl()への置き換えが機能せず(たとえば、一部のデバイスドライバーの場合)、unlocked_ioctl()を使用する必要がある場合があります。