4
Ioctl
コマンドを使用してcharデバイスモジュールの書き込み中にエラーが発生しました。LinuxカーネルのIOCTL関数の互換性のないポインタからのエラーの初期化4.8.0-53-generic Linux Mint 64ビット
static struct file_operations my_fops =
{
.unlocked_ioctl = my_ioctl, error is here. I can not fix this.
};
注:すべて私のprint_k
を無視してください。
この問題を解決してください。皆さんに感謝します。
static long my_ioctl(struct file *f,unsigned int cm,unsigned long arg[b])
{
int re;
unsigned long arg[3];
switch (cm)
{
case H_ADD:
arg[2] = arg[0] + arg[1];
print_k("Driver:Calculating is complete,Result = %d \n",arg[2]);
break;
case H_SUB:
print_k ("Driver: Start ...\n");
arg[2] = arg[0] - arg[1];
print_k("Driver:Calculating is complete,Result = %d \n",arg[2]);
break;
case H_MULL:
print_k ("Driver: Start ...\n");
arg[2] = arg[0] * arg[1];
print_k("Driver:Calculating is complete,Result = %d \n",arg[2]);
break;
case H_DIV:
print_k ("Driver: Start ...\n");
arg[2] = arg[0]/arg[1];
print_k("Driver:Calculating is complete,Result = %d \n",arg[2]);
break;
default:
print_k ("Driver: I don't have this operation!\n");
re = -Er;
break;
}
return re;
}
static struct file_operations my_fops =
{
.unlocked_ioctl = my_ioctl,
};
'static long my_ioctl(構造ファイル* f、符号なしint cm、符号なしlong arg [b])'が間違っています。最後の引数は 'arg [b]'ではなく 'unsigned long arg'でなければなりません。最後の引数がある種の配列へのポインタになるように設計されている場合は、それに応じて関数内に*をキャストする必要があります。 –
私はフォーマットを固定しました(コードを読むことができるように) –
こんにちは@BronislavElizavetinあなたの答えに感謝します。私は最後の議論について申し訳なく思っています。それは間違いです。それは署名されていない長いarg []ですが、いくつかのテストを行いました。これはカーネルバージョン4.8よりも低いバージョンで動作します。残念ながら、私自身のLinuxカーネルバージョン4.8 -64ビットでは動作しません。 –