2012-07-09 18 views
16
  1. 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

  2. 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).

  3. __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.

+0

dma belleğini remap_pfn_range belleğine eklemek için doğru yolu buldunuz mu? – Luca

cevap

11
  1. 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.

  2. 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.

  3. 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.

İlgili konular