DMA adresi bu aramadan fiziksel adresle aynı mı döndü? LDD3, DMA adresinin sürücü tarafından opak olarak ele alınması gerektiğini söylüyor. Bu DMA arabelleğini, kullanıcı alanı doğrudan okuyabildiğinden/yazabilmem için kopyalamak istiyorum. Soru, remap_pfn_range için PFN'nin ne belirtmesi gerektiğidir (şimdi benim hoş sürprizim için (çekirdek 3.4+) I/O belleğindeki gibi geleneksel bellek için çalışır). DMA adresini imzasız olarak uzun sürebilir ve bunu PFN'ye dönüştürebilir miyim? Bu LDD3'ün opaklık hakkında ne söylediğinin ihlali değil mi?dma_alloc_coherent ile ilgili bazı sorular
dma_alloc_coherent
__get_free_pages
'u her zaman kullanır mı? Bu, bölgenin potansiyel olarak her zaman fazla tahsis edildiği anlamına gelir (ilk işlev, bayt alır ancak ikinci işlev, sayfa birimleri olarak ayrılır).__get_free_pages
numaralı çağrıdan elde edilen art arda birden fazla sayfa için tek akışlı eşlemeyi kurmanın bir yolu var mı?dma_map_page
sadece tek sayfalar için geçerlidir.
16
A
cevap
11
Hayır, iade adresi aksi takdirde çekirdek uzaydan erişmek için mümkün olmaz, sanal bir adres. Fiziksel adresi temsil eden dma_handle, ama opak. Döndüğü adreste virt_to_phys'i kullanmalı ve bunu remap_pfn_range'a iletmelisin.
Yaptığına inanmıyorum (büyük olasılıkla platforma bağlı olabilir), ancak sayfaları ayırır. DMA için daha az miktarda bellek istiyorsanız dma_pool_create'i kullanmalı ve ardından bölgeleri oradan ayırmalısınız.
dma_map_page yerine dma_map_single kullanabilirsiniz.
Bu öğeler hakkında daha fazla ayrıntı için DMA-API.txt numaralı danışmana danışmanızı öneririm.
dma belleğini remap_pfn_range belleğine eklemek için doğru yolu buldunuz mu? – Luca