【发布时间】:2013-11-29 20:34:59
【问题描述】:
如果我只有通过 PCI-Express BAR(基地址寄存器)将设备缓冲区映射到的内存缓冲区的物理地址,我如何将此缓冲区 映射到用户空间?
例如,Linux 内核中的代码通常应该是什么样子?
unsigned long long phys_addr = ...; // get device phys addr
unsigned long long size_buff = ...l // get device size buff
// ... mmap(), remap_pfn_range(), Or what should I do now?
开启:Linux x86_64
发件人:https://stackoverflow.com/a/17278263/1558037
ioremap()将物理地址映射到内核虚拟地址。remap_pfn_range()将物理地址直接映射到用户空间。
发件人:https://stackoverflow.com/a/9075865/1558037
int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr,
unsigned long pfn, unsigned long size, pgprot_t prot);
remap_pfn_range - 将内核内存重新映射到用户空间
我可以这样用吗?
unsigned long long phys_addr = ...; // get device phys addr
unsigned long long size_buff = ...l // get device size buff
remap_pfn_range(vma, vma->vm_start, (phys_addr >> PAGE_SHIFT),
size_buff, vma->vm_page_prot);
问题:但是,我在哪里可以获得wma,以及在致电remap_pfn_range() 之前我必须使用wma 做什么?
【问题讨论】:
-
@Alec Teal 是的。在 Linux x86_64 上
标签: c linux linux-kernel posix pci-e