1

Linuxドライバーの開発は初めてです。

従来、char デバイスを作成したい場合は、関数read writeと関数を実装し、対応するioctlで登録するだけで済みます。そして、そのデバイスファイルを作成するために使用します。次に、ユーザー空間で呼び出すと、カーネルによって対応する関数が呼び出されます。register_chrdev_regionMajor device IDmknodMajor device IDread write open

しかし、今は、カーネル 2.6 で追加されたLinux device modelandを勉強しています。sys filesystemLinux にはデバイスとドライバーを処理するための適切なデバイス モデルがあるため、可能であれば使用しないでくださいと言わ/dev filesystemれました。これは私を混乱させました。

  1. /sys に char デバイスを作成するにはどうすればよいですか? より具体的には、のようにヌルデバイスを作成するにはどうすればよい/dev/nullですか?
  2. ユーザー空間から char デバイス ドライバー関数を呼び出すにはどうすればよいですか?
  3. でデバイスファイルを作成するudevのがベースだと聞きました。なんで?「できれば使わないでください」と言われたのに、なぜでファイルを作成するのですか?sys filesystem/dev/dev filesystemudev/sys/dev
  4. のファイルには、またはsysのような概念がありますchar device fileblock device?
  5. では/devopen writeユーザー空間から、最終的にfile operation structure私が定義した の関数にマップされます。次に、 でファイルを開いたり書き込んだりすると、どの関数が呼び出されます/ssyか?
4

1 に答える 1

3

文脈がなければ、あなたの声明/devは明確ではありません。ともかく:

  1. sysfs に char デバイスを作成することはできません。sysfs の主な目的は、情報をエクスポートし、ユーザーが単一の値を調整できるようにすることです (/sys/いくつかの例については、下に移動してください)。Char デバイスは通常、非常に複雑なことを行います。

  2. ドライバの open,read,write,ioctl などを呼び出す方法を意味する場合は、open(2)、read(2)、write(2)、ioctl(2) を実行します (これらのコマンドのマニュアル ページを参照してください)。 )

  3. デバイスが表示されると、カーネルは /sys の下にディレクトリを作成します。たとえば、 を見てくださいls /sys/bus/usb/devices/。USB デバイスが表示されると、すべてのディレクトリが作成されます。USB デバイスを抜き差しして試すことができます。udevsysfs に注目して新しいデバイスを検出し、sysfs からの情報に従って .sys の下にデバイスを作成します/dev。これは、ドライバーが何らかの方法で を呼び出したときに発生しますdevice_add()device_create多くの場合、この関数は、 、device_register、または他のサブシステムからのその他のような他のレジスタ関数によって呼び出されます。

  4. sysfs の考え方は、ロードされたデバイスとドライバーに関する情報を提供することです。したがって、デバイス、バス、およびドライバーのオプションを変更できます。または、デバイスをモジュールに手動で接続します

  5. 実際には、sysfs 属性の背後に一連の file_operation があり、ここで、オープン、読み取り、および書き込みは、ドライバーではなくカーネルによって管理されます。sysfs 属性を作成するには、関数showstoreのペアを提供して、ドライバーとの間で何かを読み書きする必要があります。次に、カーネルはリクエストを正しい属性にルーティングします

于 2015-03-31T20:53:44.293 に答える