unlock_ioctl ごとに ioctl (BKL なし) 関数を処理する Linux char デバイスを作成する必要があります。現時点では、ユーザー空間の ioctl コマンドから 1 つの引数を受け取ることができます。
__get_user(myint, (int __user *) arg);
複数の int 引数を受け取るにはどうすればよいですか (たとえば、この呼び出し)?:
ioctl(fp, SZ_NEW_DEV_FORMAT, 0, 1, 30);
はい、構造を使用する必要があります。特定の 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));