2016-09-12 2 views
0

Linuxキャラクタデバイスドライバを始めたばかりです。私はregister_chrdev()関数でデバイスを登録している単純なカーネルモジュールを作っています。私は関数に引数として0を渡し、カーネルは利用可能なフリーのメジャー番号を返します。 その後、mknodコマンドを使用して、返されたメジャー番号のキャラクタデバイスファイルを作成しています。 ドライバをカーネルにロードしましたが、ドライバ、デバイスファイル、ユーザスペースアプリケーション間の通信は問題ありません。Linuxで再起動後にキャラクタデバイスファイルが存在しない

私のシステムを再起動すると、(mknodを使って作成された)文字デバイスファイルが/ devディレクトリに存在しないという問題があります。

私のキャラクターデバイスファイルが再起動後でも/ devディレクトリに表示されるように、この問題の解決策を提案してください。

+2

'/ dev'は動的に作成されたファイルシステムです。これはディスク上の実用的なものではないため、システムをブートするたびにNEWに再作成されます。あなたのアプリがスタートアップチェーンの一部となり、毎回そのデバイスを再作成しない限り、ファイルは消えてしまいます。 –

+0

どうすればこの問題を解決できますか? –

+0

http://www.linuxquestions.org/questions/linux-newbie-8/create-a-device-file-using-udev-738448/ – stark

答えて

0

解決策の1つは、mknodコマンドでファイルを作成する代わりに、ドライバを/devに動的に作成させることです。基本的な考え方は、class_createを呼び出してモジュール初期化関数からカスタムデバイスクラスを作成し、次にdevice_createを呼び出してクラスにデバイスを追加することです。

カスタムクラスへのポインタを保持するには、タイプstruct class *の変数が必要です。

static struct class *foo_class; 

あなたのモジュールのinit関数は、クラスを作成してかどうかを確認する必要があります:この変数は、その任意の機能の外で宣言する必要があり、通常はそのようstaticに宣言されるだろう、あなたのモジュール内で様々な機能によってアクセスする必要がありますエラー:。

foo_class = class_create(THIS_MODULE, "foo"); 
    if (IS_ERR(foo_class)) { 
     /* Failed to create class. */ 
     rc = PTR_ERR(foo_class); 
     goto fail_class_create; 
    } 

は(ここで、goto fail_class_createはエラーを返す前に、これまで行って何をクリーンアップするためにラベルにジャンプしますが、この「エラー後藤の」パターンが気に入らない場合は、ここで明示的にクリーンアップして自由に感じますエラーを返す前に)

class_create関数が成功すれば、それはもはやあなたのモジュール出口機能に必要でないときに破壊されなければならず、また、エラーはさらにダウンあなたのモジュールのinit関数であるならばクリーンアップの一環として:

class_destroy(foo_class); 

ながらクラスが作成されたら、デバイスを作成するためにdevice_createを呼び出し、デバイスを破棄するにはdevice_destroyを呼び出して、そのクラスに属するデバイスを作成(および破壊)することができます(私はそれをクラスデバイスと呼びます)。どちらの関数も、デバイスノード番号(メジャーデバイス番号とマイナーデバイス番号の組み合わせ)を使用して、作成または破棄するクラスデバイスを指定します。例えば以下のようにクラスのデバイスを作成することができる。

struct device *csdev; 
    /* ... */ 
    csdev = device_create(foo_class, hwdev, MKDEV(foo_major, minor), privdata, "foo%u", minor); 
    if (IS_ERR(csdev)) { 
     /* Failed to create device. */ 
     rc = PTR_ERR(csdev); 
     /* Do any clean-up here. */ 
    } 

以前に作成したカスタムクラスに(ここで、foo_class点; hwdev根底にある「ハードウェアデバイス」へのポイントまたは全く根底がない場合NULLに設定することができますハードウェアデバイス、foo_majorはあなたの主要なデバイス番号です(register_chrdevによって割り当てられ、minorは作成するデバイスのマイナーデバイス番号です)。privdataはプライベートデータポインタであり、通常はデバイスのプライベートデータ構造を指します。 NULLであり、残りのパラメータは、printf形式の書式文字列と書式文字列によって必要とされる余分なパラメータで構成されます。デバイス名を変更してください。)

minorが0の場合、デバイスは/dev/foo0として動的に作成されます。

次のようにdevice_destroyを呼び出し、デバイスを破壊する:(。device_createに渡される。ここで、foo_classfoo_majorminor同じ)

device_destroy(foo_class, MKDEV(foo_major, minor)); 

上記機能のみGPLとしてエクスポートされしたがって、モジュールを使用する場合は、モジュールは次の宣言を使用してライセンスを宣言する必要があります。

MODULE_LICENSE("GPL"); 
関連する問題