被设备驱动程序代码执行,其中? 内核空间和用户空间?(where is device drive

2019-08-02 19:12发布

第1部分:

要在Linux / Unix专家在那里,能不能请你帮我了解有关设备驱动程序。 正如我理解,驱动器是一块码直接与硬件相互作用并暴露了一些API来访问该设备。 我的问题是哪里这段代码运行时,用户空间或内核空间?

我知道,在内核空间执行的代码有一些额外的特权,如访问任何存储位置(请纠正如果我错了)。 如果我们安装第三方的驱动程序,如果它在内核空间中运行,就不会这样会损害整个系统? 如何任何操作系统处理这个问题?

第二部分:

让我们的USB设备(摄像头,键盘..),系统如何识别这些设备的例子吗? 系统怎样知道要安装的驱动程序? 如何司机知道设备的读取和写入数据的地址?

(如果这是太大了,这里回答,请提供一些好的文档或教程链接..,我试过,但没有找到这些答案。请帮助)

Answer 1:

第1部分

在Linux上,司机在内核空间中运行。 是的,正如你的国家有没有这个显著的安全隐患。 在大多数司机会例外取下来的内核,可能会损坏内核内存(与后果的所有方式)。 越野车司机也对系统安全的影响,以及恶意驱动程序可以做他们想做不惜一切代价。

看到MacOSX上和Window NT内核的一个趋势是用户空间的驱动程序 。 微软已经有一段时间一直推的Windows用户空间驱动程序框架和MacOSX上长期以来提供火线用户空间API和USB驱动程序,并兼容类驱动程序对于许多USB外设。 这是相当不寻常的MacOSX上安装第三方内核模式设备驱动程序。

可以说,曾经有内核恐慌坏名声Windows可以归因于(通常质量较差)内核模式,与几乎所有的手机,相机和打印机驱动程序来。

Linux的图形驱动程序,几乎所有的用户空间实现以最小的内核驻留部分,和保险丝允许归档系统在用户空间实现。

第2部分

USB,火线,MCI(以及PCI-E)都具有通过其总线驱动器可以在设备匹配到驱动器列举的机制。 在实践中,这意味着所有设备暴露的元数据描述它们是什么。

元数据内包含一个的DeviceID,厂商ID和装置提供的功能和相关联的ClassID的描述。 ClassID的促进通用类驱动程序 。

从概念上讲,该操作系统将试图找到明确支持厂商ID和一个的DeviceID驱动程序,然后回落到一个支持的ClassID(S)。

匹配器件司机是在的心脏地带的一个核心概念Linux设备模型 ,并用于匹配精确匹配的标准是match()在特定的总线驱动功能。

一旦设备驱动程序被绑定到的设备,它采用了总线驱动器(或寻址由它给出的信息),以执行读出和写入。 在PCI和火线的情况下,这是一个存储器映射的IO地址。 对于USB总线它的寻址信息。

在Linux文档树提供了一些见识到了Linux的设备模型的设计,但不是真正的入门级读数。

我也建议你阅读的Linux设备驱动程序(第3版)



文章来源: where is device driver code executed? Kernel space or User space?