web-dev-qa-db-ja.com

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

lxr.linux.no でLinux 2.6.36ソースコードを調べたところ、_file_operations_にioctl()メソッドが見つかりませんでした。代わりに、2つの新しい呼び出しunlocked_ioctl()compat_ioctl()が見つかりました。 ioctl()unlocked_ioctl()compat_ioctl()の違いは何ですか?

40
Sen

メタ答え: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()を使用する必要がある場合があります。

4
Pawel Szyszuk