4

Linuxでデバイスドライバーがどのように機能するかを理解しようとしています。

  1. 次のようなデバイス ノードがあります (メジャー番号 89、デバイス名 i2c-0)

     crw-r--r--    1 0        0         89,   0 Sep 29 01:36 /dev/i2c-0
    
  2. 名前の付いた i2c ドライバーがあり、起動時i2c.koに実行します。insmod i2c.ko

  3. driver では、初期化中に次の関数が呼び出されます。

    register_chrdev(89, "i2c", &i2chtv_fops)<0    // not "i2c-0"
    

私の質問は次のとおりです。ユーザーが呼び出すときopen("/dev/i2c-0", O_RDWR)、カーネルはどのドライバーを使用するかをどのように認識しますか? デバイス名は ですi2c-0が、登録されているデバイス名はi2cです。カーネルが正しいドライバーを使用できるのは、それらが同じメジャー番号を使用しているからですか?

4

2 に答える 2

4

メジャー番号は、どのドライバーがどのデバイスファイルを処理するかを示します。マイナー番号は、ドライバーが複数のデバイスを処理する場合に備えて、ドライバー自体が操作しているデバイスを区別するためにのみ使用されます。

システムにドライバーを追加するということは、それをカーネルに登録することを意味します。これは、モジュールの初期化中にメジャー番号を割り当てることと同義です。これを行うには、linux/fs.hで定義されているregister_chrdev関数を使用します。

 int register_chrdev(unsigned int major, const char *name,
       struct file_operations *fops); 

ここで、unsigned int majorは要求するメジャー番号であり、const char*nameは/proc/devicesに表示されるデバイスの名前です。structfile_operations*fopsはドライバーのfile_operationsテーブルへのポインターです。負の戻り値は、登録が失敗したことを意味します。マイナー番号をregister_chrdevに渡さなかったことに注意してください。これは、カーネルがマイナー番号を気にしないためです。私たちのドライバーだけがそれを使用します。

ここから

于 2009-10-06T12:32:02.883 に答える
3

はい、メジャー番号はドライバーを選択し、マイナー番号は「ユニット」を選択します(それが何であれ、コンソールドライバーの場合は異なる画面です)。

表示されるの-0は「ユニット」です(システムに複数のi2cバスがある場合)。

于 2009-10-06T09:11:16.033 に答える