Part 1
在 Linux 上,驱动程序在内核空间中运行。是的,正如您所说,这会产生重大的安全隐患。驱动程序中的大多数异常都会导致内核崩溃,可能会损坏内核内存(产生各种后果)。有缺陷的驱动程序也会对系统安全产生影响,恶意驱动程序绝对可以做任何他们想做的事。
MacOS 和 Windows NT 内核上的一个趋势是用户空间驱动程序。一段时间以来,微软一直在推动,MacOSX 长期以来一直为 Firewire 和 USB 驱动程序提供用户空间 API,并为许多 USB 外设提供符合类的驱动程序。在 MacOSX 上安装第 3 方内核模式设备驱动程序是很不寻常的。
可以说,Windows 过去在内核恐慌方面的坏名声可以归因于几乎每部手机、相机和打印机都附带的(通常质量很差)内核模式驱动程序。
Linux 图形驱动程序几乎全部在用户空间中实现,具有最小的内核驻留部分,并且Fuse http://fuse.sourceforge.net允许在用户空间中实施归档系统。
Part 2
USB、Firewire、MCI(以及 PCI-e)都具有枚举机制,总线驱动程序可以通过枚举机制将设备与驱动程序进行匹配。实际上,这意味着所有设备都会公开描述其内容的元数据。
元数据中包含设备 ID、供应商 ID 以及设备提供的功能和关联的 ClassID 的描述。 ClassID 有助于通用类驱动程序 http://en.wikipedia.org/wiki/Class_driver.
从概念上讲,操作系统将尝试查找专门支持 VendorID 和 DeviceID 的驱动程序,然后回退到支持 ClassID 的驱动程序。
将设备与驱动程序相匹配是该技术的核心概念Linux设备模型 http://www.bravegnu.org/device-model/device-model.html,用于匹配的精确匹配标准是match()
函数在特定的总线驱动程序中。
一旦设备驱动程序绑定到设备,它就会使用总线驱动程序(或它给出的寻址信息)来执行读取和写入。对于 PCI 和 Firewire,这是内存映射 IO 地址。对于 USB it 总线寻址信息。
The Linux 文档树 http://kernel.org/doc/Documentation/driver-model/提供了对 Linux 设备模型设计的一些见解,但并不是真正的入门级读物。
我还建议阅读Linux 设备驱动程序(第三版) http://lwn.net/Kernel/LDD3/