linux - 从用户空间创建物理内存以用于 DMA 传输

标签 linux memory memory-management linux-kernel dma

我想创建一些内存用于 DMA 传输。 (使用 Linux 2.6.18-128.el5 #1 SMP)

我的 H/W 有一个 API 堆栈 + 内核驱动程序可以为我做这件事,但它非常非常慢!

如果我使用 API 创建 DMA 传输,它会在系统 RAM 中分配一些非常高的内存(例如,一次运行时为 0x7373a6f8)。 (我有设备的 ICD,所以有一个内存映射 mmap,这就是我如何找到这个地址,最后我想如何设置到我自己的地址,因此/dev/mem在下面的 map 中)

我似乎无法围绕这个高地址映射内存,大概是因为它超出了我的虚拟内存空间并且我被内核阻止了吗?

我想要做的是要么使用(映射)这个给定的地址,以便我可以读/写它,要么创建我自己的可以读/写的物理内存。

# cat /proc/iomem
00000000-0009fbff : System RAM
  00000000-00000000 : Crash kernel
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000f0000-000fffff : System ROM
00100000-7fd64fff : System RAM        # Is this all of /dev/mem?
  00400000-00612916 : Kernel code
  00612917-006ef9db : Kernel data

# cat /proc/3450/maps
08207000-08228000 rw-p 08207000 00:00 0          [heap]
b7e7b000-b7f85000 rw-p b7e7b000 00:00 0
b7f89000-b7f8a000 rw-p b7f89000 00:00 0
b7f8a000-b7f8b000 rw-s 80114000 00:11 1541       /dev/mem
b7f8b000-b7f8d000 rw-p b7f8b000 00:00 0
bff70000-bff85000 rw-p bffea000 00:00 0          [stack]

最佳答案

如果我对你的理解是正确的,你有一个表现不佳的设备驱动程序,你正试图通过从用户空间手动分配物理 RAM 来解决这个问题?有什么原因让您对修复驱动程序不感兴趣吗?

这听起来像是一个非常奇怪的请求,而不是大多数人认为的正确解决方案。我怀疑如果您正在处理底层驱动程序问题,您会得到更多帮助。

(从上面的评论中复制。)

关于linux - 从用户空间创建物理内存以用于 DMA 传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2318856/

相关文章:

c# - 如何在 bash 命令启动后保持应用程序打开 C#

python - 如何使用 python 执行此命令并返回结果?

c - C 中静态分配数组大小的限制

java - java Collection.sort() 的内存消耗

iPhone App 切换后崩溃,可能是由于 UIImage imageNamed

linux - 使用 SED 命令将数字转换为其名称(1=one 等)

linux - 在使用 'make' 命令后播放声音

linux - Linux RHEL 上的 RabbitMQ 内部内存路径映射到另一个位置

php - Doctrine 查询内存使用情况

c++ - string.c_str() 需要解除分配吗?