Linux内核设备驱动程序以DMA方式进入内核空间

2024-02-19

LDD3 (p:453) 演示dma_map_single使用作为参数传入的缓冲区。

bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, dev->dma_dir);

Q1:这个缓冲区来自什么/哪里?

kmalloc?

Q2:为什么 DMA-API-HOWTO.txt 声明我可以使用 rawkmallocDMA 进入?

Form http://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt http://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt

L:51 如果您通过页面分配器 kmalloc() 获取了内存,那么您可以使用从这些例程返回的地址与该内存进行 DMA 传输。

L:74 你不能从 kmap() 调用和 DMA 中获取返回值。

  1. 这样我就可以传递从返回的地址kmalloc到我的硬件设备?
  2. 或者我应该跑virt_to_bus首先?
  3. 或者我应该把它传递给dma_map_single?

Q3:当DMA传输完成后,我可以通过读取内核驱动程序中的数据吗?kmalloc地址?

addr = kmalloc(...);
...
printk("test result : 0x%08x\n", addr[0]);

Q4:将其传递到用户空间的最佳方法是什么?

  1. copy_to_user?
  2. mmap kmalloc 内存?
  3. others?

  1. kmalloc 确实是获取缓冲区的来源之一。另一个可以是带有 GFP_DMA 标志的 alloc_page。

  2. 含义是 kmalloc 返回的内存保证在物理内存中是连续的,而不仅仅是虚拟内存,因此您可以将该指针的总线地址提供给您的硬件。您确实需要在返回的地址上使用 dma_map_single() ,根据具体平台,该地址可能不再是 virt_to_bus 的包装器,或者可能执行更多操作(设置 IOMMU 或 GART 表)

  3. 正确,只需确保遵循 DMA 指南所解释的缓存一致性准则即可。

  4. copy_to_user 可以正常工作,并且是最简单的答案。根据您的具体情况,这可能就足够了,或者您可能需要性能更好的东西。通常,您无法将 kmalloced 地址映射到用户空间,但您可以 DMA 到用户提供的地址(需要注意一些)或分配用户页面(带有 GFP_USER 的 alloc_page)

祝你好运!

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

Linux内核设备驱动程序以DMA方式进入内核空间 的相关文章

随机推荐

  • 工厂方法 (1) vs 工厂 (2) vs Builder (3) 模式

    用途 1 2 3 的用例是什么 使用它有什么优点和缺点 他们之间有什么区别 工厂方法模式 这种模式与工厂模式非常相似 客户端也从类层次结构中向工厂请求特定类型的对象 但是工厂模式的 Create 方法工厂类将特定对象的创建委托给派生类并返回
  • 如何从管道 (jenkinsfile) 中使用 Jenkins Copy Artifacts 插件?

    我试图找到一个在 Jenkins 管道 工作流程 中使用 Jenkins Copy Artifacts 插件的示例 谁能指出使用它的示例 Groovy 代码吗 通过声明式 Jenkinsfile 您可以使用以下管道 pipeline age
  • 超时已过。操作完成前超时时间已过或服务器未响应

    运行 ssis 包时 我在 ADO net 源中调用 sp 但出现此错误 超时已过 操作完成之前超时时间已过 或者服务器没有响应 我已将命令超时设置为 0 无限时间 但仍然收到错误 sp 在 sql server 中工作正常 大约需要 31
  • Android Studio 签名的 APK 未安装

    我在 Android Studio 中 在 构建 gt 生成签名的 APK 下签署 APK 并使用向导 一切似乎都正常 并生成了一个 apk 文件 当我将此文件复制到我的设备 Nexus 7 或 Moto X 时 它不会安装 我收到 安装失
  • 单击电子邮件链接时出现不受支持的操作错误

    我已在 xml 中提供了指向 TextView 的电子邮件链接 但当我单击 TextView 时 它显示不支持的操作错误 如何将活动链接放在文本视图中的电子邮件上 这是我的 string xml 文件的代码
  • 如何禁用 UIScrollView 的水平滚动?

    我有一个UIView就像iPhone的跳板一样 我已经使用创建它UIScrollView and UIButtons 我想禁用所述滚动视图上的水平滚动 我只想要垂直滚动 我该如何实现这个目标 你必须设置contentSize的财产UIScr
  • Akka/Java getContext().become 带参数?

    在 Akka Scala 中 可以将参数传递给自定义接收函数 因此可以通过 params 传递整个 actor 状态 而无需使用可变变量 context become myCustomReceive param1 param2 但在 Jav
  • 为什么 strcmp 比我的函数快得多?

    我写了一个函数 Str Compare 这基本上是一个strcmp以另一种方式重写 在比较两个函数时 在循环中重复 500 000 000 次 strcmp执行速度太快 大约x750快几倍 这段代码是在 C 库中编译的 Os参数有效 int
  • 为什么输入错误值后输出是三行消息而不是一行?

    输入的代码是 import java io IOException public class A public void fn throws IOException char ch do System out println Press C
  • 由于 MIME 类型不匹配,IE9 脚本响应被阻止

    我使用以下代码片段将 google fusion 表中的数据加载为 json var fileref document createElement script fileref setAttribute type text javascri
  • Visual Studio 2010 中的文本覆盖

    这里真的很愚蠢的问题 在 Visual Studio 2010 中 文本光标已从闪烁的线更改为字符周围闪烁的灰色框 当我输入时会覆盖前面的文本 我不知道如何去掉这个 这就像当您在 Microsoft Word 中按插入键并打开覆盖模式时会发
  • 证书验证失败:证书已过期 (_ssl.c:1108)

    当尝试运行我的 Discord 机器人时 我收到此错误 raise ClientConnectorCertificateError aiohttp client exceptions ClientConnectorCertificateEr
  • 如何在 Windows 启动时启动 python 文件?

    我有一个 python 文件并且正在运行该文件 如果 Windows 关闭并再次启动 我如何在每次 Windows 启动时运行该文件 根据脚本正在执行的操作 您可以 将其打包成服务 然后安装该服务 将其添加到 Windows 注册表 HKC
  • 我想在启动画面中播放lottie动画React Native

    在 React Native 中 在应用程序启动之前 我们可以看到白屏 我想在单击应用程序图标时立即加载启动屏幕 我想避免白色背景 Using 反应本机启动画面 https github com crazycodeboy react nat
  • 使用远程 couchbase 和 AWS ec2 时超时

    出于开发目的 我想将本地计算机连接到安装在远程 ec2 上的 couchbase 我成功建立连接 但当我尝试访问数据时出现超时 我搜索了问题并发现here https stackoverflow com questions 12117746
  • Java 的 varargs 性能

    编码 我来检查 Java 的 vararg 性能 我编写以下测试代码 public class T public static void main String args int n 100000000 String s1 new Stri
  • PHP 全局常量是一种良好的现代开发实践吗?

    我正在开发一个具有相当大的 PHP 代码库的新项目 该应用程序使用了相当多的 PHP 常量 define FOO bar 特别是对于数据库连接参数之类的事情 这些常量都定义在一个配置文件中 该文件是require once 基本上应用程序中
  • 连接两个时间序列的最有效方法

    想象一下我有一张这样的表 CREATE TABLE time series snapshot date DATE sales INTEGER PRIMARY KEY snapshot date 具有这样的值 INSERT INTO time
  • 运行查询时“不支持使用USE语句在数据库之间切换”

    尝试使用以下命令选择数据库时出现以下错误php s标准mssql select db功能 USE statement is not supported to switch between databases Use a new connec
  • Linux内核设备驱动程序以DMA方式进入内核空间

    LDD3 p 453 演示dma map single使用作为参数传入的缓冲区 bus addr dma map single dev gt pci dev gt dev buffer count dev gt dma dir Q1 这个缓