11

パート1:

Linux/Unix の専門家の皆様、デバイス ドライバーについて理解を深めていただけませんか。私が理解しているように、ドライバーはハードウェアと直接対話し、デバイスにアクセスするためのいくつかの API を公開するコードです。私の質問は、このコードがどこで実行されるか、ユーザー空間またはカーネル空間ですか?

カーネル空間で実行されるコードには、任意のメモリ位置へのアクセスなどの追加の特権があることを知っています (間違っていれば、pls は正しいです)。サード パーティ製のドライバーをインストールし、それをカーネル空間で実行すると、システム全体に悪影響を及ぼしませんか? OSはこれをどのように処理しますか?

パート2:

USB デバイス (カメラ、キーボードなど) の例を見てみましょう。システムはこれらのデバイスをどのように認識しますか? システムはどのドライバーをインストールするかをどのように認識しますか? ドライバーは、データを読み書きするデバイスのアドレスをどのように認識しますか?

(これが大きすぎてここで答えることができない場合は、いくつかの優れたドキュメントまたはチュートリアルのリンクを提供してください..、私は試しましたが、これらの答えを見つけることができませんでした.pls help)

4

1 に答える 1

20

パート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)も読むことをお勧めします

于 2012-11-15T11:57:04.557 に答える