2010-12-16 12 views
1

register_chrdev関数では、デバイス名を指定する必要があります。同じメジャー番号を持つ別の名前のデバイスを作成しても、正しく動作します。だから、その機能に名前を付けることの意義は何か。LKMG chardev.cについての質問register_chrdev関数

私はregister_chrdevのmanページを1として、これに初心者:)

答えて

0

午前:

The name parameter is a short name for the device 
and is displayed in the The /proc/devices list. It also 
must exactly match the name passed to unregister_chrdev 
function when releasing the functions. 

ので、名前は本当にための方法として以外のすべてのカーネルで使用されていませんあとで取り消すことができるように登録を特定し、/ procデバイスリストでドライバを呼び出すことが賢明になるようにします。

異なる名前と同じ主要な仕事を持つ2つの別々のregister_chrdevを持つ理由は、現代のLinuxカーネルが複数のドライバが同じメジャー番号を登録し、基本的に共有することができるからです。おそらく、両方のドライバーは、そのメジャーのすべての呼び出しを取得し、マイナー番号に基づいてアクションを取るかどうかを決定する必要があります。私が今までに働いたすべてのドライバーとすべてのドライバーが、「メジャー番号ごとのドライバー」に従うように、私は本当に分かりません。

メジャー番号をハードコーディングするよりも、 register_chrdevにゼロを渡し、カーネルにあなたのために無料のメジャー番号を選んで返してもらうようにしてください。この方法では、他のドライバのつま先を踏むことを心配する必要はありませんが、/ devエントリを正確にmknodするには、ユーザスペースのコードチェック/ proc /デバイスを持つ必要があります。

+0

[udev](http://en.wikipedia.org/wiki/Udev)は、/ devのエントリの作成と破棄を処理する必要があります。正しいことが自動的に行われない場合は、デバイスの新しいルールを書き込むことができます。 – Karmastan

+0

[Linuxデバイスドライバ、第3版](http://lwn.net/Kernel/LDD3/)を参照してください。この本の第3章も同じことを言います。 の例では、/ dev/nullと/ dev/zeroはどちらもドライバ1で管理されていますが、仮想コン のソールとシリアル端末はドライバ4で管理されています。 vcs1とvcsa1の両方は デバイスはドライバ7で管理されています。現代のLinuxカーネルでは複数のドライバがメジャー番号を共有できますが、表示されるほとんどのデバイスは1つのメジャー1ドライバの原理で編成されています " –