DMA転送に使用するメモリを作成したいと思います。(Linux 2.6.18-128.el5#1 SMPを使用)
H / W用のAPIスタック+カーネルドライバーがあり、これを実行できますが、非常に低速です。
APIを使用してDMA転送を作成すると、システムRAMの非常に高い位置にメモリが割り当てられます(たとえば、1回の実行で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]