パート1
Linux では、ドライバーはカーネル空間で実行されます。はい、あなたが述べているように、これには重大なセキュリティ上の影響があります。ドライバーのほとんどの例外は、カーネルをダウンさせ、カーネル メモリを破損する可能性があります (あらゆる種類の結果を伴います)。バグのあるドライバーはシステムのセキュリティにも影響を与え、悪意のあるドライバーは、やりたいことを何でも実行できます。
MacOSX および Window NT カーネルで見られる傾向は、ユーザー空間ドライバーです。Microsoft はしばらく前からWindows Userspace Driver Frameworkを推し進めており、MacOSX は Firewire および USB ドライバー用のユーザー空間 API、および多くの USB 周辺機器用のクラス準拠ドライバーを長い間提供してきました。MacOSX にサード パーティのカーネル モード デバイス ドライバをインストールすることは非常にまれです。
おそらく、Windows がカーネル パニックに対して持っていた悪い評判は、ほぼすべての携帯電話、カメラ、およびプリンターに付属している (多くの場合品質が低い) カーネル モード ドライバーに起因する可能性があります。
Linux グラフィックス ドライバーはほとんどすべてユーザー空間に実装されており、カーネル常駐部分は最小限に抑えられています。Fuseを使用すると、ファイル システムをユーザー空間に実装できます。
パート2
USB、Firewire、MCI (および PCI-e) にはすべて、バス ドライバーがデバイスとドライバーを照合できる列挙メカニズムがあります。実際には、これは、すべてのデバイスが、それらが何であるかを説明するメタデータを公開することを意味します。
メタデータには、DeviceID、VendorID、およびデバイスが提供する機能の説明と関連する ClassID が含まれています。ClassID は、ジェネリッククラス ドライバを容易にします。
概念的には、オペレーティング システムは VendorID と DeviceID を具体的にサポートするドライバーを見つけようとし、次に ClassID をサポートするドライバーにフォールバックします。
デバイスをドライバーに一致させることは、 Linux デバイス モデルの中心にあるコア コンセプトであり、一致に使用される正確な一致基準match()
は、特定のバス ドライバーで機能します。
デバイス ドライバーがデバイスにバインドされると、バス ドライバー (またはバス ドライバーによって提供されるアドレス指定情報) を使用して、読み取りと書き込みが実行されます。PCI と Firewire の場合、これはメモリ マップド IO アドレスです。USB it バスのアドレッシング情報。
Linux ドキュメンテーション ツリーは、Linux デバイス モデルの設計についてある程度の洞察を提供しますが、実際には入門レベルの読み物ではありません。
Linux Device Driver (3rd Edition)も読むことをお勧めします