Büyük bir DMA arabelleğini, yaklaşık 40 MB boyutunda ayırmak istiyorum. Ben dma_alloc_coherent()
kullandığınızda, başarısız ve gördüğüm: Ben farklı değerler denedim ve dma_alloc_coherent()
fazla 2^25 bayt (32 MB) tahsis edemez gibi görünüyorBüyük bir DMA arabelleğinin ayrıştırılması
------------[ cut here ]------------
WARNING: at mm/page_alloc.c:2106 __alloc_pages_nodemask+0x1dc/0x788()
Modules linked in:
[<8004799c>] (unwind_backtrace+0x0/0xf8) from [<80078ae4>] (warn_slowpath_common+0x4c/0x64)
[<80078ae4>] (warn_slowpath_common+0x4c/0x64) from [<80078b18>] (warn_slowpath_null+0x1c/0x24)
[<80078b18>] (warn_slowpath_null+0x1c/0x24) from [<800dfbd0>] (__alloc_pages_nodemask+0x1dc/0x788)
[<800dfbd0>] (__alloc_pages_nodemask+0x1dc/0x788) from [<8004a880>] (__dma_alloc+0xa4/0x2fc)
[<8004a880>] (__dma_alloc+0xa4/0x2fc) from [<8004b0b4>] (dma_alloc_coherent+0x54/0x60)
[<8004b0b4>] (dma_alloc_coherent+0x54/0x60) from [<803ced70>] (mxc_ipu_ioctl+0x270/0x3ec)
[<803ced70>] (mxc_ipu_ioctl+0x270/0x3ec) from [<80123b78>] (do_vfs_ioctl+0x80/0x54c)
[<80123b78>] (do_vfs_ioctl+0x80/0x54c) from [<8012407c>] (sys_ioctl+0x38/0x5c)
[<8012407c>] (sys_ioctl+0x38/0x5c) from [<80041f80>] (ret_fast_syscall+0x0/0x30)
---[ end trace 4e0c10ffc7ffc0d8 ]---
.
Böyle büyük bir DMA arabelleği nasıl dağıtılabilir?
Büyük DMA tamponlar pahalıdır. Bellek bloğu, bitişik fiziksel bellek olmalıdır (bazı SPARC sistemlerinde olduğu gibi I/O için bir MMU yoksa) ve kilitlenmiş olmalıdır (sayfa hataları için daha yüksek öncelikli görevler için yer açmak üzere sayfalandırılamaz). Tipik bir çözüm, birden fazla DMA arabelleği kullanmak ve DMA zincirleme (aka dağılım/toplama) kullanmaktır. Gerçekten bir blokta 40MB aktarım yapan bir G/Ç işlemi var mı, yoksa gerçekten bir operasyon birikimi mi? – sawdust
Üzerinde çalıştığım yazılımın kullanımı, özel bir donanım tarafından video yakalama ve görüntü işleme için büyük DMA arabellekleri gerektirir. Birkaç küçük arabellek kullanılarak yapılabilir, ancak zamanla parçalanma, arabelleklerin sorunlu hale getirilmesini ve yeniden tahsis edilmesini sağlar. İhtiyacım olan DMA arabelleklerinin boyutu ve miktarı sabittir, bu nedenle belleği önyüklemede bir kez ayırmak ve kullanıcı alanındaki bellek isteklerini yönetmek istiyorum. – miluz
@miluz, bu sorunu çözdünüz mü? Nasıl ? – ransh