文書による。 、ioctl署名はint ioctl(int fd, int request, ...)
です。 requestはioctlのコードです。
私のLinuxで利用可能なすべての可能なioctl要求コードを知る方法はありますか?そして、各カーネルモジュールがどのコードにマップされているかを知るにはどうすればよいでしょうか。
カーネルソース、ioctl
およびvim
プログラムを使用して、すべてのctags
定義を見つけることができます。私は自分のツールボックスからツールを使用するだけですが、他のものを使用できます-IDE NetbeansやEclipseのようです。本質は同じです。
デモ:(この.gif
ファイルをダウンロードして、たとえばGIMPで開くことができます。その後、すべてのフレームが時間制限なしで使用可能になります)-
説明:
1)私は、カーネルソースを掘り下げる以外に他の方法はないと思います。異なるマニュアルが存在します。apropos ioctl
を確認してください。ただし、それらは不完全であるか、古くなっています。したがって、最も信頼できる方法はソースを調べることです(モジュール作成者からのドキュメントがない場合)。ユーザープロセスはioctl
システムコールを使用して、さまざまなコマンドをカーネルモジュールに送信します。モジュールには、各ioctlコマンドの定義とコメントがあります。私たちの仕事はそれらを見つけることです。
メモ開始
glibc
ヘッダーはユーザープログラムのコンパイルで使用されるため、システムの現在のカーネルではなく、glibc
と同じカーネルソースバージョンを使用する必要があります。したがって、最後のカーネルソース(またはglibc
とは異なるもの)を使用する場合、結果は間違っている可能性があります。
Ubuntuでglibc
ヘッダーのバージョンを見つけるには、次のようにします。
dpkg -l linux-libc-dev*
結果:
ii linux-libc-dev:AMD64 4.15.0-50.54 AMD64 Linux Kernel Headers for development
Ubuntuパッチを含むカーネルソースコードをリポジトリから現在のディレクトリ(Ubuntu)にダウンロードします。
apt-get source linux-source-4.15.0
メモの終わり
2)ioctlコマンドはモジュールヘッダーファイルで定義されます-some_name.h。これらは単なる数値であり、特別なマクロで計算できます。
#define "ioctl name" __IOX("major number","command number","argument type")
ドキュメント から:
カーネルに新しいioctlを追加する場合は、linux/ioctl.hで定義されている_IOマクロを使用する必要があります。
_IO an ioctl with no parameters _IOW an ioctl with write parameters (copy_from_user) _IOR an ioctl with read parameters (copy_to_user) _IOWR an ioctl with both write and read parameters.
ただし、一部のioctl
定義はこの規定に従っていないため、tty
ドライバーの場合のように、通常のマクロと違いはありません。
#define TCGETS 0x5401
そのため、grep
ヘッダーファイルだけを使用することはできません。
3)定義されたioctlコマンドがモジュールソースコードファイルで使用されている-some_name.c。 ioctl要求ごとに呼び出される特別な関数-ハンドラーがあります。 ioctl番号を引数として取り、プログラムの実行を次のように対応するブランチに切り替えます。
switch(ioctl_cmd){
case IOCTL_ONE:
processing;
break;
case IOCTL_TWO:
processing;
break;
case IOCTL_THREE:
processing;
break;
}
4)このioctlハンドラは.unlocked_ioctl
に格納されていますfile_operations struct
のフィールド:
static const struct file_operations sonypi_misc_fops = {
...
.unlocked_ioctl = sonypi_misc_ioctl,
したがって、この割り当てをソースコードで見つけ、ctags
プログラムでハンドラー関数の定義にジャンプし、ioctlブランチを確認できます。 switch
構造。次に、さらにジャンプして、ヘッダーファイルの特定のコマンドに移動し、定義とコメントを確認します。