微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux内核 – 设备驱动程序代码在哪里执行?内核空间还是用户空间?

第1部分:

对于linux / unix专家来说,请帮助我了解设备驱动程序.据我所知,驱动程序是直接与硬件交互的代码,并且暴露了一些apis来访问设备.我的问题是这段代码在哪里运行,用户空间或内核空间?

我知道在内核空间中执行的代码有一些额外的权限,如访问任何内存位置(如果我错了,请务必正确).如果我们安装第三方驱动程序,如果它在内核空间运行,这对整个系统是不是有害的?操作系统如何处理?

第2部分:

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

(如果这太大了,不能回答这里,请提供一些良好的文档或教程的链接..我已经尝试,找不到这些的答案pls help)

解决方法

第1部分

Linux上,驱动程序在内核空间中运行.是的,正如你所说的那样,对此有重大的安全隐患.驱动程序中的大多数异常将占用内核,从而可能会损坏内核内存(带来各种后果). Buggy驱动程序也会对系统安全性产生影响,而恶意驱动程序可以做任何事情.

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便于通用Class Drivers.

在概念上,操作系统将尝试找到一个特别支持vendorID和deviceid的驱动程序,然后回到支持ClassID的驱动程序.

匹配设备与驱动程序是Linux Device Model核心概念,匹配的精确匹配标准是特定总线驱动程序中的match()函数.

一旦设备驱动程序被绑定到一个设备,它使用总线驱动程序(或由它提供的寻址信息)执行读写操作.在PCI和Firewire的情况下,这是一个内存映射的IO地址.对于USB,它的总线寻址信息.

Linux Documentation tree提供了对Linux设备模型设计的一些了解,但并不是真正的入门级阅读.

我也建议阅读Linux Device Driver (3rd Edition)

原文地址:https://www.jb51.cc/linux/393672.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐