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

2024-01-12

Part1:

对于那里的 linux/unix 专家,您能帮助我了解设备驱动程序吗?据我了解,驱动程序是一段直接与硬件交互并公开一些 api 来访问设备的代码。我的问题是这段代码在哪里运行,用户空间还是内核空间?

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

Part2:

让我们以USB设备(相机,键盘..)为例,系统如何识别这些设备?系统如何知道要安装哪个驱动程序?驱动程序如何知道设备的地址来读写数据呢?

(如果这太大了,无法在这里回答,请提供一些好的文档或教程的链接..,我已经尝试过,但找不到这些答案。请帮助)


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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设备驱动程序代码在哪里执行?内核空间还是用户空间? 的相关文章

  • 我如何解释 meminfo 中的所有内存?

    我试图理解如何meminfo跟踪记忆 这是我正在看的内容 MemTotal 341596 kB MemFree 147288 kB Buffers 56 kB Cached 46752 kB SwapCached 0 kB Active 8
  • 自动持有自旋锁时返回是否不安全?

    受人尊敬的书说 The flags参数传递给spin unlock irqrestore必须与传递给的变量相同spin lock irqsave 您还必须致电spin lock irqsave and spin unlock irqrest
  • 使用 GCC 为 Linux 设备驱动程序编译 Intel AVX 内联

    我在 corei7 上的 ubuntu 上运行 gcc 版本 4 8 2 从谷歌搜索中找到了有关 AVX 内在函数的信息 但我不确定这组内在函数是否可以用于 Linux 设备驱动程序并进行编译 如果可以的话 这里的任何人都可以告诉我 mak
  • 一般:如何更改 Android 核心 API 类?

    这只是一个一般性问题 供我参考 我知道如何创建标准的 Android 应用程序 但我想知道 这怎么可能 人们如何增强 Android 核心功能并深入挖掘系统 例如 假设我想调整下载管理器 http developer android com
  • Python 上的 io.open() 和 os.open() 有什么区别?

    我意识到open 我一直在使用的函数是一个别名io open 以及导入 from os会掩盖这一点 通过以下方式打开文件有什么区别io模块和os module io open 是文件 I O 的首选高级接口 它将操作系统级文件描述符包装在一
  • 操作系统如何知道缺失页面的磁盘地址?

    分页充当虚拟地址空间和物理地址空间之间的间接层 给定一个地址 操作系统 OS 内存管理单元 MMU 将其转换为主内存位置 我的问题是 主内存中不存在该页面的情况 操作系统如何知道在磁盘上哪里可以找到该页面 它在哪里存储1的信息 它不存储在页
  • 如果物理内存的大小是2^32-1,那么虚拟内存的大小是多少?

    我知道物理地址是 32 位长 但是如何通过这些信息找出虚拟内存的大小 虚拟内存地址空间的总大小为2 32x86架构和更大 目前约为 2 48 x64建筑学 然而 操作系统通常会保留一部分空间 因此 32 位应用程序不一定能一次寻址 4GB
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 从内核空间中的块设备读取

    我正在编写一个内核模块 需要从现有的块设备执行读取 dev 东西 有谁知道有任何其他模块可以执行这些操作 我可以用作参考吗 欢迎任何指点 Linux 2 6 30 如果你真的绝对必须那么使用filp open filp close vfs
  • 确定分区属于什么文件系统

    操作系统如何知道分区正在使用什么文件系统 换句话说 FAT16 32 NTFS ext2 3等如何区分 如果您在 Windows 上使用 Win32 API 则可以调用 GetVolumeInformation http msdn micr
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 如何用Java写入OS系统日志?

    Mac OS 有一个名为 Console 的应用程序 其中包含记录的消息 错误和故障 我相信 Windows 中的等效项是事件查看器 我想 Linux 上也有一个 但我不知道它是什么 也不知道它在哪里 是否可以像这样从 Java 输出获取消
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 为什么在谈论线程和进程时,“不要同时格式化软盘”的评论很有趣?

    我正在阅读之间的区别线程和进程 https stackoverflow com questions 200469 what is the difference between a process and a thread并在第二个答案中发现
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • Linux内核container_of宏和C90中的通用容器

    是否有可能实施容器的 http lxr linux no linux tools perf util include linux kernel h L18纯C90中的宏 我不确定如何做到这一点 因为内核实现取决于海湾合作委员会黑客 http
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的

随机推荐

  • 如何将 Spring Boot 应用程序日志文件读取到 Splunk 中? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望将日志数据从应用程序发送到 Splunk 我发现这与spring无关 只是Splunk需要一些配置来读取应用程序的日志文件 我想知道
  • 我可以将 SQL Server Management Studio 2005 用于 2008 DB 吗?

    我希望使用 Management Studio 2005 管理 SQL Server 2008 DB 原因是我们的服务器是 64 位计算机 而我们只有 64 位版本的软件 这可能吗 使用 Management Studio 2008 管理
  • 使用 stackalloc 分配的内存的初始化

    如果我分配内存stackalloc in C 内存是否已初始化 with 0 该文档没有提到这一点 只是告诉我们保留了正确的金额 在我的测试中 这种内存默认为0 但这并不意味着它是有保证的 从规格来看 18 8 堆栈分配 新分配的内存的内容
  • 如何重写WPF路由命令调度机制

    我可以以某种方式扩展 WPF 命令路由 以便它首先检查命令是否可以在聚焦字段中调用 如果不能在其他字段中调用 永远不会改变 有什么钩子吗 也许您不知道这是否可行 但在网络上的某个地方看到了类似的内容并且可以保留链接吗 抽象例子 例如 如果我
  • WebRTC:如何为视频编码器启用硬件加速

    我正在尝试在 WebRTC 的帮助下将屏幕捕获的视频发送到 mediasoup WebRTC 库中有一个类 Android 屏幕捕捉器 它可以工作 但在某些设备上的性能非常糟糕 特别是当我使用高清或更好的显示分辨率时 在 stackover
  • OpenCV:链接错误,无法解析外部符号 _cvResize 和 _cvCvtColor

    链接错误的原因很清楚 我的链接过程中缺少一些库 不幸的是 OpenCV 2 4 1 似乎改变了它的内部结构 所以我通过 Google Stackoverflow 搜索功能找到的解决方案只建议我链接到不再存在的库 cv lib 或 cxcor
  • 使用c#生成不记名令牌

    我有一个网络应用程序 我的要求是我需要在每次登录时生成 oauth2 不记名令牌 目前我们使用thinktecture来生成token 但是这个过程每次生成token大约需要7秒的时间 有什么方法可以在不使用 thinktecture 的情
  • SwiftUI 共享表导致 iPad 崩溃

    我正在关注这个教程https jeevatamil medium com how to create share sheet uiactivityviewcontroller in swiftui cef64b26f073 https je
  • 如何用eclipse安装android?

    我想用 eclipse 安装 android sdk 我也使用 Ubuntu 作为操作系统 请给予支持以及关于android的良好学习材料 Regards 要开始使用 Eclipse 进行 Android 开发 您必须安装ADT Plugi
  • 如何使用 glassfish v4 将 http 重定向到 https

    我们在 Glassfish v4 上创建了一个网站 它使用端口 8080 作为 http 使用端口 8081 作为 https 我们的思科防火墙将对端口 80 的请求转发到端口 8080 并将对端口 443 的请求转发到端口 8081 但我
  • 如何使用Eclipse IDE调试基于JavaFX 11的Maven项目(2019-03)

    问题 我无法使用建议的方法调试使用 Eclipse IDE 2019 03 4 11 0 编写和启动的基于 JavaFX 11 的 Maven 项目并用于相关问题 https stackoverflow com questions 5652
  • 如何在 R 中创建 (100%) 堆叠直方图?

    我的数据集 我有以下格式的数据 此处是从 CSV 文件导入 您可以找到 CSV 格式的示例数据集here http cl ly 3F1u0W2b3y081v172A2O PAIR PREFERENCE 1 5 1 3 1 2 2 4 2 1
  • Twig 在第一个特定字符作为分隔符后分割字符串

    我有一个与以下情况相同的问题这个问题 https stackoverflow com q 17304739 6578454 除了可能发生不止一个 是在正文中 一个例子 57b42a0557cdd Filename whatever pdf
  • 将 QWidget 嵌入 X11 窗口

    我想将两个 QWidget 嵌入到使用 XLib 创建的窗口中 我写了这段代码 Assume all the necessary headers included int main int argc char argv QApplicati
  • App Engine Datastore IN 运算符 - 如何使用?

    阅读 http code google com appengine docs python datastore gqlreference html http code google com appengine docs python dat
  • QPushButton:如何对齐图标和文本

    使用 Qt C 我有一些带有图标和文本的按钮 由于所有按钮的文本长度不同 图标未对齐 我尝试使用 QToolButton 代替 button gt setToolButtonStyle Qt ToolButtonTextBesideIcon
  • 在初始化时使用 attr_accessor 设置 ruby​​ 2.0 关键字参数

    如何动态设置而不需要全部编写相同的代码 现在代码如下所示 def initialize keywords keywords title title url url adsetting adsetting self keywords keyw
  • C# 睡眠 500 毫秒

    您能告诉我如何将程序暂停 500 毫秒然后继续吗 I read Thread Sleep 500 不好 因为它会占用 GUI 线程 使用计时器它会触发回调 我只想等待 500 毫秒 然后继续下一条语句 请指教 编辑 我需要显示状态栏消息 5
  • Mysqli 抽象,从准备好的语句中获取数组

    最近 我在一个曾经工作得很好的库中偶然发现了一个错误 如果我能找出它在哪里 我就该死了 代码示例如下 我对其中的调试内容表示歉意 但我正在努力使其正常工作 问题是 temp 是一个具有正确键 列名 的数组 但所有值都是 NULL 我认为问题
  • 设备驱动程序代码在哪里执行?内核空间还是用户空间?

    Part1 对于那里的 linux unix 专家 您能帮助我了解设备驱动程序吗 据我了解 驱动程序是一段直接与硬件交互并公开一些 api 来访问设备的代码 我的问题是这段代码在哪里运行 用户空间还是内核空间 我知道在内核空间中执行的代码具