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()