Linux下获取缓冲区的物理地址

2023-11-23

我在具有完整 MMU 的 Xilinx Microblaze 上运行 Linux 内核 3.3。我正在执行的任务要求我了解以下内容:我需要创建一个文本文件(缓冲区)并找到该缓冲区的物理地址,并且我不希望内核将此文件写入不连续的内存区域。

我需要这个的原因是因为我有一个 DMA 引擎,可以从预设的物理内存地址流式传输数据,所以我需要强制 Linux 在该确切的内存位置创建缓冲区文件,这样当我将数据写入该文件时,它会立即传输由 DMA 引擎传输到另一个硬件核心

更多细节:

我的系统有一个 512 MB DDR3 RAM 通过“Xilinx”多端口内存控制器(MPMC)连接到系统。该内存控制器的基地址是 0x90000000,系统中的所有单元都通过该控制器访问内存,包括 MicroBlaze、DMA我的单元使用一种称为本机个性接口(NPI)的特殊接口在非常低的级别与内存进行通信,从而产生非常高的速度性能。

该 NPI DMA 单元最初设计为在名为“xilkernel”的非常基本的嵌入式内核下使用,该内核不支持虚拟内存,MMU 都不是 MicroBlaze 的一部分,因此程序员可以看到操作系统代码将驻留在何处并选择物理内存地址(例如 0x91800000)作为 DMA 传输的源地址,然后程序员可以将文件放置在该确切地址中并运行系统

当我们需要迁移项目以使用 Linux 而不是 xilkernel 时,我们遇到了这个问题,我在外部存储设备上有文件,我可以从 Linux 作为块设备访问这些文件,并且我需要将每个文件移动到主内存(DDR3 RAM)并使 DMA 流化文件。 目前,DMA 流来自固定地址,但如果需要,我可以将其设为通用。


为了处理与 DMA 控制器接口的缓冲区,有特定的函数。这些函数不仅负责地址转换,还负责缓存与内存的一致性,例如缓存刷新(在发送之前将数据写入内存)和缓存无效(在接收之前使缓存无效)。

(1) 分配缓冲区,获取虚拟地址和物理地址:

void *dma_alloc_coherent(struct device *dev, size_t size,
                         dma_addr_t *dma_handle, gfp_t flag)

函数的返回值是分配的缓冲区的虚拟地址,而dma_handle指针保存的是分配的缓冲区的物理地址。

(2) 传递分配给设备的一个缓冲区:

dma_addr_t dma_map_single(struct device *dev, void *ptr,
                          size_t size,
                          enum dma_data_direction dir)

返回值是缓冲区的物理地址,参数dir是DMA_TO_DEVICE,ptr是缓冲区的虚拟地址;

(3) 从设备接收一个缓冲区:

void dma_unmap_single(struct device *dev, dma_addr_t addr,
                            size_t size,
                            enum dma_data_direction dir)

参数dir是DMA_FROM_DEVICE。

笔记: 要使用与 dma 相关的三个函数,必须将设备注册到具有 dma_map_ops 的特定总线上,否则这三个函数将无法使用。

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

Linux下获取缓冲区的物理地址 的相关文章

  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • 映射文件和链接器文件之间的区别

    链接器生成的映射文件与包含内存段本身的链接器文件有什么区别 链接器 文件是链接器的一组命令 涉及如何在内存中布置所有内容 并由程序员创建 映射 文件是所有内容在内存中位置的列表 由链接器创建
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有
  • Python ctypes from_buffer 使用上下文管理器映射到内存映射文件(mmap)

    我在用着ctypes from buffer 将 ctypes 结构映射到内存映射文件以执行某些任务 通常 这些文件包含结构化标头和二进制数据的串联 ctypes 结构允许稳定的二进制表示和对字段的简单 Python 访问 在这方面是真正的
  • 读取文件而不从操作系统页面缓存中逐出

    这主要适用于 Linux 或者理想情况下适用于任何 POSIX 系统 当我阅读以下页面时 我正在寻找一种读取大量文件 其中任何一个文件本身可能高达 1GB 的方法 具有以下特征 如果相关磁盘页面已在文件系统缓存中 则使用该页面 如果相关页面
  • 编译内核进行页表遍历时出现错误

    我正在执行页表遍历 当我准备更新内核时出现错误 kernel sys c In function do sys get page info kernel sys c 2745 23 error passing argument 1 of p
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 评估 gdb 中的变量/函数

    我有以下代码 char seg mmap 0 printf seg x n seg 该程序打印seg b7ffd000 而在 gdb 中 对于相同的执行 当使用p x seg 它打印 2 0x0 我在这里很困惑 这不是同一个var吗seg
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 民意调查立即从驱动程序中退出

    这是我第一次在 Linux 内核中实现驱动程序并面临这个问题 我正在尝试在我的字符驱动程序中实现 poll 我已调用 poll wait 并传递了一个等待队列 当从用户空间程序打开该驱动程序的设备文件并在此设备文件描述符 fd 上调用 po
  • /proc/kmsg 和 dmsg 有什么区别?

    我们通常这样做cat proc kmsg or dmesg从用户空间查看内核日志 我明白了dmesg是一个循环缓冲区 它从kmsg 但是kmsg也不是循环缓冲区 它们之间有什么区别和联系呢 宽松地说 dmesg 是一个转储 proc kms
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 为什么在32位armv7l上mmap 4GB文件成功?

    我的印象是来自mmap 2 手册页和搜索结果 mmap仅限于系统可用的地址空间 减去系统保留的地址空间 所以在 32 位 armv7l 上 我假设它大约是 3GB 4GB 1GB 但似乎我实际上可以mmap5 GB 文件没有任何问题 int
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 基于 MIPS 的 codesourcery 工具链的编译参数?

    我在我的 WIN 7 机器上安装了用于 mips32 架构的 codesourcery 交叉编译工具链 我想首先为我的路由器编译一个基于 MIPS32 的简单 阶乘 二进制文件 在网上搜索了一下 我发现它是基于MIPS32 big endi
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w

随机推荐

  • 为什么 Qt 中的字体显得模糊或像素化?

    我所有的字体都出现像素化 所以我使用AntiAliasing但这没有帮助 正如您在图像本身中看到的像素化字体 这是我当前使用的代码 butt1 QtWidgets QLabel Scrappr font QtGui QFont font s
  • 可以在 contenteditable div 中使用浏览器的撤消功能来撤消“range.insertNode”吗?

    我正在研究一个contenteditablediv 制作一个简单的富文本编辑器 我的要求之一是能够在按钮事件的光标位置插入 html 块 我能够通过使用使该部分正常工作range selection range insertNode nod
  • 反转表行

    我想反转表格正文行使用 jQuery 我拥有的 table width 630 border 0 cellspacing 0 cellpadding 0 thead tr td TITLE A td td TITLE B td 继续 jsf
  • 我可以处理 HTML

    我在 SO 和其他地方看到了很多关于右键单击事件以及如何使用 JavaScript 捕获和处理它们的问题和答案 通常使用 button的属性event浏览器生成的对象 然而 我还没有找到的一件事 可能是因为这是一个非常奇怪的请求 是如何捕获
  • “??”是什么意思?意思是?

    我正在查看 ASP NET MVC 1 0 生成的代码 并且想知道 双问号是什么意思 This constructor is not used by the MVC framework but is instead provided for
  • 在 C# 中使用 XML 文件存储数据

    我基本上是在寻找有人在这方面为我指明正确的方向 我阅读了一些 Microsoft 文档 但这并没有多大帮助 这是我第一次尝试使用 XML 我正在编写一个应用程序 需要存储已知用户的列表以及每个用户创建的别名列表 我已经弄清楚如何在应用程序关
  • Python Django ValueError:源代码字符串不能包含空字节

    我已经放下了一个我已经工作了几个月的 Django 项目 当我尝试重新运行服务器时 我收到了这个错误 ValueError source code string cannot contain null bytes 回溯是 C Users B
  • 在ios7中重新加载tableView标题

    如何在不重新加载所有表的情况下做到这一点 UIView tableView UITableView tableView viewForHeaderInSection NSInteger section UIView header if se
  • 无点风格并使用 $

    如何结合使用 和无点风格 一个明显的例子是下面的实用函数 times Int gt a gt a times n xs concat replicate n xs 只是写concat replicate产生错误 同样你不能写concat r
  • 在 Github 上获取 Travis Shield 以反映所选分支状态

    现在 无论我在 github 项目页面中选择哪个分支 我都可以让 travisshield 反映最新运行或特定分支 我可以通过在 URL 末尾省略或指定分支名称来完成此操作 相反 我想获得与所选分支相对应的盾牌 换句话说 每次我选择不同的分
  • 使用 javascript 取消注释 html 代码

    带有一些注释标签的 Html 表 我只是想取消注释这些标签 我尝试过使用 javascript 的正则表达式 但问题是它删除了整个注释行 因为我只是想取消注释这些标签 下面是带有注释标签的示例 html 表 table tr td ABCD
  • Angular2在第一次点击后删除点击事件绑定

    在我的应用程序中 我有一个甚至可以单击的按钮
  • 流星反应中的时刻?

    一直在使用https github com acreeger meteor moment在流星中 它工作得很好 但是有没有一种方法可以使时刻反应输出 以便它计数 3秒前 4秒前 等 我不会为每个单独的计时器使用新的会话变量 而是创建一个Tr
  • 如何识别并设置 Maven 中缺少的环境属性?

    我进行了构建设置 以便通过命令行传递变量 mvn clean install DsomeVariable data 在我的 pom 中我有
  • 如何在Python中将有符号整数转换为无符号整数

    假设我有这个号码i 6884376 我如何将其称为无符号变量 就像是 unsigned long i in C Assuming 你心里有 2 的补码表示 和 By unsigned long you mean无符号 32 位整数 那么你只
  • 如何为Web方法传递可选参数?

    我有一个带有多个参数的网络方法 web方法只依赖2个字段 其余都是可选的 OperationContract public string WarehouseContactInformation int WAID Required strin
  • (一般)从自定义数据类型构建解析器?

    我正在开发一个需要与服务器通信的网络流媒体客户端 服务器将响应编码为字节串 例如 1 NULJohn NULTeddy NUL501 NUL 其中 NUL 是分隔符 上面的响应翻译为 这是一条类型1的消息 由服务器硬编码 它告诉客户端用户的
  • 仅使用 sed 或 awk 从 html 页面提取 url 的最简单方法

    我想从 html 文件的锚标记中提取 URL 这需要在 BASH 中使用 SED AWK 来完成 请不要使用 Perl 做到这一点最简单的方法是什么 你也可以做这样的事情 前提是你安装了 lynx Lynx 版本 lynx dump lis
  • 理解 Java 字节

    因此 昨天在工作中 我必须编写一个应用程序来计算 AFP 文件中的页数 所以我重新整理了 MO DCA 规范 PDF 并找到了结构化字段BPG Begin Page 及其 3 字节标识符 该应用程序需要在 AIX 机器上运行 因此我决定用
  • Linux下获取缓冲区的物理地址

    我在具有完整 MMU 的 Xilinx Microblaze 上运行 Linux 内核 3 3 我正在执行的任务要求我了解以下内容 我需要创建一个文本文件 缓冲区 并找到该缓冲区的物理地址 并且我不希望内核将此文件写入不连续的内存区域 我需