2012-02-21 13 views
6

I Linux çekirdeği için FPGA sürücüsü üzerinde çalışıyorum. Kod x86 üzerinde iyi çalışıyor gibi görünüyor, ancak x86_64 üzerinde bazı sorunlarım var. DMA akışı gerçekleştirdim.Akış DMA PCIE linux çekirdek sürücüsü

get_user_pages(...); 
for (...) { 
    sg_set_page(); 
} 
pci_map_sg(); 

Ama pci_map_sgPAGE_SIZE tarafından hizalanmamıştır 0xbd285800 gibi adresler, döndü, bu yüzden tam ilk sayfayı gönderemezsiniz gibi PCIE şartname

"İstekler belirtmemelidir diyor çünkü Yani, gider 412 KB sınırını geçmek için bir Bellek Alanı erişimine neden olan bir Adres/Uzunluk birleşimi. "

Hizalanmış adresler almanın bir yolu var mı, yoksa önemli bir şeyi mi özledim?

Source code of DMA. akla gelen

+0

Gerçek kaynağınızdan kod ekleyebilir misiniz? Böceği tespit etmek için yeterli yok. –

+0

Evet, tabiki. Orijinal yayına eklenmiştir. – soh

+0

@soh: Bunu halka açıklamak için bir plan var mı? Açık bir sürücü için etrafa bakıyordum ve iyi bir tane bulamadım. Kendimi yazmak için çok tembel olmak, test etmede yardımcı olmaktan ve yardımcı olmaktan memnuniyet duyarım. –

cevap

3

ilk olasılık geliyor kullanıcı tampon bir sayfa sınırında başlayacak olmamasıdır. Başlangıç ​​sayfanız bir sayfadan 0x800 baytsa, ilk sg_set_page aramanızdaki ofset 0x800 olacaktır. Bu, 0x800 ile biten bir DMA adresi üretecektir. Bu gerçekleşmesi normal bir şey ve bir böcek değil. pci_map_sg sayfaları coalesces gibi

, bu ilk bölüm bir sayfadan daha büyük olabilir. Önemli olan, pci_map_sg'un DMA adreslenebilir belleğinin bitişik bloklarını üretmesidir, ancak düşük düzey PCIe işlemlerinin bir listesini oluşturmaz. X64'te büyük bir bölge elde etme olasılığınız daha yüksektir, çünkü çoğu x64 platformunda IOMMU vardır. Ben başa

Birçok cihaz bana birkaç megabayt mantıksal aktarım uzunluğunu belirtmek için izin DMA motorları var. Normal olarak, PCIe uç noktadaki DMA uygulaması, her 4kB sınırında yeni bir PCIe işlemi başlatılmasından sorumludur ve programcı bu kısıtlamayı göz ardı edebilir. FPGA'daki kaynaklar bunun üstesinden gelmek için çok sınırlıysa, bellek kodlarının Linux listesini PCIe işlemlerinin bir (çok daha uzun) listesine dönüştürmek için sürücü kodu yazmayı düşünebilirsiniz.

+0

Çok teşekkürler. Kullanıcı arabelleği tamam, ancak FPGA PCIE çekirdeği uzun arabellekleri işlemiyor. – soh

İlgili konular