从哪里开始学习 Linux DMA/设备驱动/内存分配

2024-01-25

我正在移植/调试设备驱动程序(由另一个内核模块使用)并面临死胡同,因为 dma_sync_single_for_device() 因内核错误而失败。

我不知道这个函数应该做什么,而且谷歌搜索也没有什么帮助,所以我可能需要了解更多关于这个东西的知识。

问题是,从哪里开始呢?

哦,是的,如果相关的话,代码应该在 PowerPC 上运行(Linux 是 OpenWRT)

编辑: 最好有在线资源(书籍需要几天才能送达:)


On-line:

Linux slab 分配器剖析 http://www.ibm.com/developerworks/linux/library/l-linux-slab-allocator/

了解 Linux 虚拟内存管理器 http://www.phptr.com/content/images/0131453483/downloads/gorman_book.pdf

Linux 设备驱动程序,第三版 http://lwn.net/Kernel/LDD3/

Linux 内核模块编程指南 http://tldp.org/LDP/lkmpg/2.6/html/

在 Linux 中编写设备驱动程序:简要教程 http://www.freesoftwaremagazine.com/node/1238/

Books:

Linux 内核开发(第二版) https://rads.stackoverflow.com/amzn/click/com/0672327201

基本 Linux 设备驱动程序 https://rads.stackoverflow.com/amzn/click/com/0132396556(仅限前4-5章)

有用的资源:

Linux 交叉参考 http://lxr.linux.no/+trees(所有内核的可搜索内核源)

2.6内核系列中的API变化 http://lwn.net/Articles/2.6-kernel-api/


dma_sync_single_for_device http://lxr.linux.no/#linux+v2.6.33/arch/arm/include/asm/dma-mapping.h#L425 calls dma_sync_single_range_for_cpu在文件中再往上一点,这是源文档(我假设即使这是针对arm的,接口和行为是相同的):

/**
 380 * dma_sync_single_range_for_cpu
 381 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
 382 * @handle: DMA address of buffer
 383 * @offset: offset of region to start sync
 384 * @size: size of region to sync
 385 * @dir: DMA transfer direction (same as passed to dma_map_single)
 386 *
 387 * Make physical memory consistent for a single streaming mode DMA
 388 * translation after a transfer.
 389 *
 390 * If you perform a dma_map_single() but wish to interrogate the
 391 * buffer using the cpu, yet do not wish to teardown the PCI dma
 392 * mapping, you must call this function before doing so.  At the
 393 * next point you give the PCI dma address back to the card, you
 394 * must first the perform a dma_sync_for_device, and then the
 395 * device again owns the buffer.
 396 */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从哪里开始学习 Linux DMA/设备驱动/内存分配 的相关文章

  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • C++中const对象位于哪个内存区域? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 什么时候通过引用传递不是一个好主意?

    这是一个我从未真正理解的内存分配问题 void unleashMonkeyFish MonkeyFish monkey fish new MonkeyFish std string localname Wanda monkey fish g
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C

随机推荐

  • 在 TypeScript 中扩展与实现纯抽象类

    假设我有一个纯抽象类 即没有任何实现的抽象类 abstract class A abstract m void 就像在 C 和 Java 中一样 我可以extend抽象类 class B extends A m void But unlik
  • 在 JavaScript 中将所选项目置于数字选择器小部件内的中心

    前提 我很难弄清楚如何制作数字选择器小部件行为类似于移动选择器组件 https developer android com guide topics ui controls pickers 如果用户默认分配一个号码 则selected页面加
  • get_by_id() 将不会返回模型实例

    我有一个名为 Version 的模型 如下所示 from google appengine ext import db import piece class Version db Model A particular version of
  • 了解 Thrust (CUDA) 内存使用情况

    我正在使用 cuda thrust 库进行一些蒙特卡罗模拟 这在一定数量的模拟中效果很好 在模拟中我得到了 bad alloc 异常 这看起来没问题 因为我的代码中越来越多的模拟意味着要处理越来越大的 device vectors 所以我预
  • 如何检查我正在使用哪个版本的 Angular?

    如何知道我正在使用哪个版本的 Angular 我努力了 angular version angular v angular version angular v but get bash angular command not found 我
  • 现在如何安装Visual Studio 2015 PlatformSDK?

    当我运行某些东西时 例如pip install scrapy 使用 python 3 7 我遇到了麻烦error WinError 3 The system cannot find the path specified C Program
  • GCC 发出 ARM idiv 指令(续)

    我想知道这对于 Krait 400 CPU 是否可行 我遵循了一些建议here https stackoverflow com questions 15782089 gcc to emit arm idiv instructions 当我使
  • Azure PHP SDK:在单个 zip 文件中下载容器的所有 blob

    我想将指定容器中的所有 blob 下载为 zip 文件 有没有办法直接从 Azure 下载 zip 文件 而不需要在我的服务器上处理它 目前我的想法如下 file put contents file name get file conten
  • 以 Zend Repo 作为源,从 master 制作本地 Git 存储库

    我想在测试服务器上克隆主分支 在该服务器上运行主分支和测试站点 此存储库是 Zend PHP 框架应用程序 在配置文件中 home me public html domain com ZendSkeletonApplication git
  • 突出显示根目录的父路径

    我尝试通过更改节点和链接的填充来突出显示从鼠标所在的节点到根节点的路径 我正在使用 Mike s 的 Radial Tidy TreeBlock https bl ocks org mbostock 4063550 我尝试过node anc
  • 使用 Spring MVC 流式传输可关闭资源

    读完后本文 https www airpair com java posts spring streams memory efficiency 我希望使用 Spring 将数据库查询结果直接流式传输到 JSON 响应 以确保恒定的内存使用量
  • 禁用 mod_deflate 和 mod_gzip 压缩 HTML、CSS 和 JS 的最佳方法

    我在运行 Apache 2 的共享主机上有几个站点 我想压缩传送到浏览器的 HTML CSS 和 Javascript 主机已禁用 mod deflate 和 mod gzip 因此这些选项无效 不过 我确实有 PHP 5 所以我可以使用它
  • 通过累积串联将嵌套列表转换为非嵌套列表

    我想像这样转换嵌套列表 l lt list A list a list 1 b list 2 B list cd list c list 3 4 5 d list 6 7 8 e list c 9 10 进入列表 o lt list A c
  • 通过 ODBC“十进制值缩放导致数据截断”

    当我尝试在 MS Access 中查看 ODBC 表时 收到错误 十进制值缩放导致数据截断 我知道返回错误的字段 并且 Access 在查询时能够识别该字段 但我无法查看结果 Error记录 并且错误不断出现 我试过了CDbl 没有运气 A
  • 停止 IntentService 的正确方法

    我正在使用 IntentService 将图像上传到服务器 我的问题是我不知道如何 何时停止服务 当我在 onHandleIntent Intent 中调用 stopself 时 所有在 IntentService 队列中等待的 Inten
  • Typescript 模块创建 AMD 与 Common JS

    任何 Typescript 专家都可以澄清一下在使用 Typescript 时何时以及为何选择 AMD 与 Common JS 来创建模块吗 AMD 用于浏览器 例如 RequireJS 原因是它允许并行下载文件 因为网络延迟是主要瓶颈 C
  • 创建 HTML(PHP 或 Jquery)的最佳实践?

    我有一个 JavaScript 对象 其中包含一些信息 我可以想到两个选项来从这个对象创建 HTML 我想知道哪一种是正确的做事方式 这只是所有偏好吗 1 使用 JavaScript 循环遍历这个数组并使用 Jquery 创建 HTML 2
  • 生成 10000 位随机序列

    有没有比在循环中附加 0 和 1 更有效的方法来在 Python 中生成 10 kBit 10 000 位 随机二进制序列 如果您想要一个随机二进制序列 那么生成适当范围内的随机整数可能是最快的 import random s random
  • 实时卡中的 OpenGL?

    我一直在研究 glass GDK 和 glass 原生 Java 开发 我有一个在 Glass 上运行良好的开放 GL 应用程序 使用标准 Android 约定 我希望将其移植到 GDK 以利用语音触发器等功能 虽然我当然可以轻松地将它用作
  • 从哪里开始学习 Linux DMA/设备驱动/内存分配

    我正在移植 调试设备驱动程序 由另一个内核模块使用 并面临死胡同 因为 dma sync single for device 因内核错误而失败 我不知道这个函数应该做什么 而且谷歌搜索也没有什么帮助 所以我可能需要了解更多关于这个东西的知识