久しぶりにPCIデバイスでDMA転送するドライバ(linuxのカーネルモジュール)を書いたので,メモ.
dma_addr | DMAアドレス(物理アドレス,バスアドレスとも) |
cpu_addr | CPUアドレス(論理アドレス) |
DMA関連のAPIは linux/pci.h にて定義されている.
まず,DMA用のバッファを確保するAPI
struct pci_dev *dev; dma_addr_t dma_addr; void *cpu_addr; cpu_addr = pci_alloc_consistent(dev, size, &dma_addr)
解放は
pci_free_consistent(dev, size, cpu_addr, dma_handle);
cpu_addr から struct page を取るAPI
struct page *virt_to_page(void *cpu_addr);