第1部分
在 linux 上,驱动程序在内核空间中运行。是的,正如您所说,这对安全有重大影响。驱动程序中的大多数异常都会关闭内核,可能会损坏内核内存(带来各种后果)。有缺陷的驱动程序也会对系统安全产生影响,恶意驱动程序绝对可以为所欲为。
MacOSX 和 Window NT 内核上的一个趋势是用户空间驱动程序。一段时间以来,Microsoft 一直在推动Windows 用户空间驱动程序框架,MacOSX 长期以来一直为 Firewire 和 USB 驱动程序提供用户空间 API,并为许多 USB 外围设备提供类兼容的驱动程序。在 MacOSX 上安装 3rd 方内核模式设备驱动程序是很不寻常的。
可以说,Windows 过去因内核恐慌而声名狼藉的原因可归咎于几乎每部手机、相机和打印机都附带的(通常质量较差的)内核模式驱动程序。
Linux 图形驱动程序几乎都是在用户空间中实现的,只有最少的内核驻留部分,Fuse允许在用户空间中实现文件系统。
第2部分
USB、Firewire、MCI(以及 PCI-e)都具有枚举机制,总线驱动程序可以通过该机制将设备与驱动程序匹配。实际上,这意味着所有设备都会公开描述它们的元数据。
元数据中包含 DeviceID、VendorID 以及设备提供的功能和相关 ClassID 的描述。ClassID 有助于通用类驱动程序。
从概念上讲,操作系统将尝试找到专门支持 VendorID 和 DeviceID 的驱动程序,然后回退到支持 ClassID(s) 的驱动程序。
将设备与驱动程序匹配是Linux 设备模型的核心概念,用于匹配的精确匹配标准是match()
特定总线驱动程序中的功能。
一旦设备驱动程序被绑定到设备上,它就会使用总线驱动程序(或由它提供的寻址信息)来执行读写操作。对于 PCI 和 Firewire,这是一个内存映射的 IO 地址。对于 USB it 总线寻址信息。
Linux 文档树提供了对 Linux 设备模型设计的一些见解,但并不是真正的入门级阅读。
我还建议阅读Linux 设备驱动程序(第 3 版)