我编写了一个内核驱动程序,它暴露给我的I / O设备的用户空间。 使用mmap,应用程序获取虚拟地址以写入设备。 由于我希望应用程序写入使用大型PCIe事务,因此驱动程序将此内存映射为写入组合。 根据内存类型(写入组合或非高速缓存),应用程序应用最佳方法来使用该设备。
但是,有些架构不支持写入组合,也可能只支持部分内存空间。 因此,内核驱动程序告诉应用程序是否成功将内存映射为写入组合是很重要的。
我需要一种通用的方法来检查内核驱动程序,如果它映射(或将要映射)的内存是否是写入组合。 我该怎么做?
这是我的代码的一部分:
vma-> vm_page_prot = pgprot_writecombine(vma-> vm_page_prot); io_remap_pfn_range(vma,vma-> vm_start,pfn,PAGE_SIZE,vma-> vm_page_prot);
答案 0 :(得分:0)
首先,您可以通过宏ARCH_HAS_IOREMAP_WC
了解架构是否支持在编译时进行写入组合。例如,请参阅here。
在运行时,您可以检查ioremap_wc
或set_memory_wc
和朋友的返回值是否成功。