パート1
Linuxの場合、ドライバはカーネルスペースで動作します。そして、あなたがそこに重要なセキュリティの意味を述べるように、そうです。ドライバのほとんどの例外はカーネルを破棄し、カーネルのメモリが破壊される可能性があります(すべての結果が得られます)。バギードライバーはシステムのセキュリティーにも影響を与え、悪意のあるドライバーは自分が望む何かを絶対に行うことができます。
MacOSXとWindow NTカーネルで見られる傾向は、ユーザースペースドライバです。 Microsoftはしばらくの間、Windows Userspace Driver Frameworkを推し進めており、MacOSXはFirewireとUSBドライバ用のユーザースペースAPIと、多くのUSB周辺機器用のクラス準拠ドライバを提供してきました。サードパーティのカーネルモードのデバイスドライバをMacOSXにインストールするのは非常に珍しいことです。
おそらく、Windowsはカーネルパニックのために持っていた悪い評判はほぼすべての携帯電話、カメラやプリンタに付属の(多くの場合、低品質)、カーネルモードドライバに起因することができます。
Linuxグラフィックスドライバは、カーネル常駐部分を最小限に抑えてユーザー空間に実装されています。Fuseは、ユーザー空間にファイルシステムを実装することができます。
第2
USB、ファイヤワイヤ、MCI(また、PCI-E)全ては、バス運転者にデバイスを一致させることができ、それを通して列挙機構を有します。実際には、これはすべてのデバイスが自分が何であるかを記述するメタデータを公開することを意味します。メタデータ内に含まれる
はデバイスID、ベンダーID及びデバイスが提供する機能および関連のclassidの説明です。 ClassIDは汎用Class Driversを容易にします。
概念的には、オペレーティングシステムは、具体的にはベンダーIDとデバイスIDをサポートするドライバを見つけるためにしようとし、その後のClassID(複数可)をサポートするものにフォールバック。
ドライバとデバイスのマッチングは、Linux Device Modelの中心となるコアコンセプトであり、マッチングに使用される一致条件は特定のバスドライバではmatch()
です。
デバイスドライバは、デバイスにバインドされると、バスドライバ(またはそれによって与えられるアドレッシング情報)を使用して読み書きを実行します。 PCIとFirewireの場合、これはメモリマップされたIOアドレスです。 USBの場合は、アドレス情報をバスに送ります。
Linux Documentation treeは、Linuxデバイスモデルの設計についていくつかの洞察を提供しますが、実際にはエントリレベルの読書ではありません。
私はまた、次の2つの別々のものにこの質問を分割する必要があり
Linux Device Driver (3rd Edition)を読んでお勧めします。 – SomeWittyUsername
私の昔のLinuxデバイスドライバ開発では、デバイスドライバがカーネル内でコンパイルされ、100%のカーネルスペースが実行されました。今日のカーネルは、バグのあるデバイスドライバから自分自身を守り、割り込みすることさえあるようです。しかし、私が学問の試験の質問であれば、 "カーネルスペース"を答えとして取っていきます。 –
USBデバイスの検出については、デバイスを認識するためにVIDとPIDが使用されます。 –