web-dev-qa-db-ja.com

すべてのioctlコードとそれらがマッピングするモジュールを取得する

文書による。 、ioctl署名はint ioctl(int fd, int request, ...)です。 requestはioctlのコードです。

私のLinuxで利用可能なすべての可能なioctl要求コードを知る方法はありますか?そして、各カーネルモジュールがどのコードにマップされているかを知るにはどうすればよいでしょうか。

5
Keystone

カーネルソース、ioctlおよびvimプログラムを使用して、すべてのctags定義を見つけることができます。私は自分のツールボックスからツールを使用するだけですが、他のものを使用できます-IDE NetbeansやEclipseのようです。本質は同じです。

デモ:(この.gifファイルをダウンロードして、たとえばGIMPで開くことができます。その後、すべてのフレームが時間制限なしで使用可能になります)- enter image description here

説明:

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.cioctl要求ごとに呼び出される特別な関数-ハンドラーがあります。 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構造。次に、さらにジャンプして、ヘッダーファイルの特定のコマンドに移動し、定義とコメントを確認します。

2
MiniMax