すべてのioctlコードにマップされたモジュールをインポートする

すべてのioctlコードにマップされたモジュールをインポートする

医者によって。 、ioctlの署名はですint ioctl(int fd, int request, ...)。リクエストはioctlコードです。

私のLinuxで利用可能なすべてのioctlリクエストコードが何であるかを知る方法はありますか?各コードがどのカーネルモジュールにマップされているか知りたいですか?

ベストアンサー1

ioctlすべての定義はカーネルソースコードvimとプログラムを使ってctags見つけることができます。私はツールボックスのツールのみを使います。 NetbeansやEclipseなどのIDEなどの他のツールを使用することもできます。本質は同じです。

デモ: (この.gifファイルをダウンロードしてGIMPを介して開くことができます。これにより、すべてのフレームに時間制限はありません。) ここに画像の説明を入力してください。

説明する:

1)私の考えでは、カーネルソースコードを掘り下げる以外に他の方法はないと思います。様々なマニュアルが存在します。確認してみてくださいapropos ioctl。しかし、不完全または古いです。したがって、最も信頼できる方法は、ソースコードを見ることです(モジュール作成者のドキュメントがない場合)。ユーザープロセスはioctlシステムコールを使用してカーネルモジュールにさまざまなコマンドを送信します。このモジュールには各モジュールの定義と説明があります。I/W制御注文する。私たちの使命はそれらを見つけることです。

興味が始まります

ヘッダーはユーザープログラムのコンパイルに使用されるため、システムの現在のカーネル以外のglibcユーザーと同じカーネルソースバージョンを使用する必要があります。glibcしたがって、最後のカーネルソース(またはカーネルソースとは異なるソース)を使用すると、glibc結果が正しくない可能性があります。

glibcUbuntuでヘッダーバージョンを見つけるには:

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) I/W制御コマンドはモジュールヘッダーファイルで定義されています。some_name.h。これは数字にすぎず、特別なマクロを使用して計算できます。

#define "ioctl name" __IOX("major number","command number","argument type")

~から文書:

カーネルに新しいioctlを追加するには、次に定義されている_IOマクロを使用する必要があります。Linux/ioctl.h:

_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ヘッダーファイルのみを持つことはできません。

三)限られたI/W制御このコマンドはモジュールソースコードファイルで使用されます。some_name.c。すべての関数によって呼び出される特別な関数であるハンドラがあります。I/W制御必要です。かかるI/W制御番号をパラメータとして指定し、プログラムの実行をその分岐に切り替えます。例:

switch(ioctl_cmd){
    case IOCTL_ONE:
        processing;
        break;
    case IOCTL_TWO:
        processing;
        break;
    case IOCTL_THREE:
        processing;
        break;
}

4)これI/W制御.unlocked_ioctlハンドラは次のフィールドに保存されますfile_operations struct

static const struct file_operations sonypi_misc_fops = {
    ...      
    .unlocked_ioctl = sonypi_misc_ioctl,

したがって、ソースコードからこの割り当てを見つけ、プログラムを介してctags処理機能定義にジャンプして表示できます。I/W制御建設中の支店switch。次に、ヘッダファイルの特定のコマンドに移動して定義と説明を確認します。

おすすめ記事