2017-10-28 16 views
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, 
}; 
+1

'static long my_ioctl(構造ファイル* f、符号なしint cm、符号なしlong arg [b])'が間違っています。最後の引数は 'arg [b]'ではなく 'unsigned long arg'でなければなりません。最後の引数がある種の配列へのポインタになるように設計されている場合は、それに応じて関数内に*をキャストする必要があります。 –

+3

私はフォーマットを固定しました(コードを読むことができるように) –

+1

こんにちは@BronislavElizavetinあなたの答えに感謝します。私は最後の議論について申し訳なく思っています。それは間違いです。それは署名されていない長いarg []ですが、いくつかのテストを行いました。これはカーネルバージョン4.8よりも低いバージョンで動作します。残念ながら、私自身のLinuxカーネルバージョン4.8 -64ビットでは動作しません。 –

答えて

2

関数プロトタイプでの第三引数unsigned long arg[b]が疑わしいです:

は、ここに私のコードです。たとえそれがポインタであると思われるとしても、単にunsigned long argであるべきです。関心のあるタイプにキャストするのは簡単です内の機能体です。

..任意のarg引数は、ユーザーが整数またはポインタとして指定したかどうかにかかわらず、unsigned longの形式で渡されます。

Linux Device Drivers 3, Chapter 6, Section 1

また、引数の1つとして同じ名前を持つ変数内の関数本体を宣言するために間違っているのです。 unsigned long arg[3];の別の名前を選択してください。

関連する問題