%E3%80%81Unlocked_ioctl()%E3%80%81compat_ioctl()%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F.png)
Linux 2.6.36のソースコードを見る:lxr.linux.noioctl()
、方法が見つかりませんfile_operations
。代わりに、2つの新しい呼び出しが見つかりました:unlocked_ioctl()
とcompat_ioctl()
。ioctl()
、、そしてunlocked_ioctl()
の違いは何ですかcompat_ioctl()
?
答え1
メタ回答:Linuxカーネルで発生したすべての生の操作は通過します。lkml(Linuxカーネルメーリングリスト)。説明の概要を表示するには、読んで検索してください。lwn (Linux Weekly News)。
答え:ioctl() の新しい方法渡すジョナサン・コベット:
ioctl()
BKL(Big Kernel Lock)の下で実行されるカーネルの残りの部分の1つ。過去には、BKLを使用すると、長期的な実行ioctl()
方法により、無関係なプロセスに長い遅延が発生する可能性がありました。
unlocked_ioctl
以下は、2.6.11で導入されたパッチの説明ですcompat_ioctl
。これioctl
フィールドの削除2.6.36で非常に遅く起きました。
説明:ioctl
実行時にコストが発生します。大きなカーネルロック(BKL)なので、同時に他の項目を実行することはできません。これはマルチプロセッサシステムではあまり良くないので、BKLを取り除くために多くの努力を払ってきました。まずunlocked_ioctl
紹介が与えられます。これにより、各ドライバーの作成者は使用するロックを選択できます。これは難しい可能性があるため、古いドライバはまだ機能しますがioctl
(使用されている)、新しいドライバには拡張インターフェイス(unlocked_ioctl
)を使用できる移行期間があります。最終的に、すべてのドライバが変換されioctl
削除される可能性があります。
compat_ioctl
実際には関係ありませんが、同時に追加されました。その目的は、32ビットユーザーモードプログラムをioctl
64ビットカーネルから呼び出すことを可能にすることです。最後のパラメータの意味はioctl
ドライバーによって異なり、ドライバー独立変換は不可能です。
答え2
場合によっては、(include/linux/fs.h) 構造体ファイルの操作メソッド ioctl() を compat_ioctl() に置き換えることは、カーネル 2.6.36 (たとえば、一部のデバイスドライバの場合) では動作せず、Unlocked_ioctl を使用する必要があります ()。