如果我只有通过 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
我必须做些什么?wma
remap_pfn_range()