1. ホーム
  2. linux

[解決済み] IOCTL Linuxデバイスドライバ [終了しました]

2022-03-13 21:43:15

質問

どなたか説明してください。

  1. とは何ですか? IOCTL ?
  2. 何に使うのですか?
  3. どのように使用するのですか?
  4. と同じ働きをする新しい関数を定義することはできないのでしょうか? IOCTL ?

解決方法は?

について ioctl は、デバイス固有のシステムコールの一種であり、入出力制御を意味します。Linuxには300~400のシステムコールがありますが、デバイス固有の機能をすべて表現することはできません。そこで、ドライバはioctlを定義して、ユーザ空間のアプリケーションから命令を送れるようにすることができます。しかし、ioctl はあまり柔軟性がなく、少し乱雑になりがちです(何十もの "magic numbers" これらはただ動くかどうか...)また、バッファをカーネルに渡すので、安全でないこともあります - 悪い処理をすると簡単に壊れてしまいます。

代替案として sysfs インターフェイスで、ファイルを /sys/ を作成し、それを読み書きしてドライバとの情報を取得します。設定方法の一例です。

static ssize_t mydrvr_version_show(struct device *dev,
        struct device_attribute *attr, char *buf)
{
    return sprintf(buf, "%s\n", DRIVER_RELEASE);
}

static DEVICE_ATTR(version, S_IRUGO, mydrvr_version_show, NULL);

そして、ドライバのセットアップ時。

device_create_file(dev, &dev_attr_version);

この場合、デバイス用のファイルを /sys/ 例えば、以下のようになります。 /sys/block/myblk/version はブロックドライバの場合です。

もっとヘビーに使うならnetlinkという方法もあります。これはIPC(プロセス間通信)で、BSDのソケット・インターフェースを使ってドライバと会話する方法です。これは、例えばWiFiドライバで使用されています。そして、ユーザースペースから libnl または libnl3 のライブラリーを使用します。