Если у меня есть только физический адрес буфера устройства (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()?

Ответы на вопрос(2)

Ваш ответ на вопрос