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

时间:2010-02-23 14:32:18

标签: 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在下面的地图中)

我似乎无法围绕这个高地址mmap内存,可能是因为它超出了我的虚拟内存空间而且被内核阻止了?

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

# 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]

1 个答案:

答案 0 :(得分:0)

如果我正确理解你,你的设备驱动程序表现不佳,你是否试图通过从用户空间手动分配物理RAM来解决这个问题?你是不是有兴趣修改驱动程序?

这听起来像是一个非常奇怪的请求,而不是大多数人认为适当修复的东西。如果您正在处理潜在的驱动程序问题,我怀疑您会得到更多帮助。

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