3

unlock_ioctl ごとに ioctl (BKL なし) 関数を処理する Linux char デバイスを作成する必要があります。現時点では、ユーザー空間の ioctl コマンドから 1 つの引数を受け取ることができます。

__get_user(myint, (int __user *) arg);

複数の int 引数を受け取るにはどうすればよいですか (たとえば、この呼び出し)?:

ioctl(fp, SZ_NEW_DEV_FORMAT, 0, 1, 30);
4

1 に答える 1

5

はい、構造を使用する必要があります。特定の ioctl コマンドには、事前定義された引数がいくつかあります。これらすべての引数を構造体オブジェクトにラップし、オブジェクトのアドレスを渡す必要があります。カーネル内で、指定された引数を構造体ポインターに型キャストし、引数にアクセスする必要があります。例えば。

 struct mesg {
         int size;
         char buf[100];
 };

 struct mesg msg1;

 /*Fill in the structure object here and call ioctl like this*/
 ret = ioctl(fd, SZ_NEW_DEV_FORMAT, &msg1);

カーネル内では、次のようにアクセスします。

      struct mesg *msg;
      copy_from_user((char *)msg, (char *)arg, sizeof(*msg));
于 2012-01-18T07:14:46.007 に答える