芯片可以从一个(或多个)物理页面连续地将其数据DMA输出,例如刷新一系列LED等。
驱动程序提供两个页面,一个用于芯片的主动使用,一个非活动的页面由应用程序准备新数据。为了获得良好的性能,可以使用mmap()直接访问应用程序。
一旦应用程序填满了非活动页面,它就会通过IOCTL切换这两个页面。驱动程序使用remap_pfn_range()将物理页面映射到用户的虚拟地址空间。
然而,似乎不可能的是从IOCTL交换两个页面,也使用remap_pfn_range()。在尝试时我看到了这个:
"内部错误:糟糕 - BUG:0 [#1]预览SMP ARM"在remap_pfn_range()。
有没有办法在初始映射后替换mmap()' ed区域的底层物理页面?
当然玩这个会有点危险但是在受控设置中这是可以接受的。
更新:似乎我可以通过在通过remap_pfn_range()映射不同页面之前调用zap_vma_ptes()来解决这个问题。当应用程序通过IOCTL切换映射页面时,我的测试应用程序确实会看到我的测试驱动程序放入其两个物理页面的不同内容。我不知道这是否有任何不良影响,以前在这个地区没有工作过。