Если у меня есть только физический адрес буфера устройства (PCIe), как я могу сопоставить этот буфер с пользовательским пространством?
Если яиметь только физический адрес буфера памяти, в который отображается буфер устройства через PCI-Express BAR (Base Address Register), как я могу отобразить этот буферв пространство пользователя?
Например, как обычно должен выглядеть код в 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()
?