Dictionary 为什么在我不';不使用ioremap\u缓存?

Dictionary 为什么在我不';不使用ioremap\u缓存?,dictionary,ram,memory-address,ioremap,Dictionary,Ram,Memory Address,Ioremap,我在x86系统上使用ubuntu 12.10 32位。我有物理内存(大约32MB,有时更多),它作为设备通过ACPI表枚举和保留,因此linux/OS无法使用它。我有这个内存设备的Linux驱动程序。驱动程序实现mmap(),以便当进程调用mmap()时,驱动程序可以将此保留物理内存映射到用户空间。有时,我在mmap中除了设置VMA并将VMA->vmops指向vm_operations_结构外,什么也不做,只实现了打开-关闭和故障函数。当应用程序访问mmapped内存时,我得到一个页面错误,并调

我在x86系统上使用ubuntu 12.10 32位。我有物理内存(大约32MB,有时更多),它作为设备通过ACPI表枚举和保留,因此linux/OS无法使用它。我有这个内存设备的Linux驱动程序。驱动程序实现mmap(),以便当进程调用mmap()时,驱动程序可以将此保留物理内存映射到用户空间。有时,我在mmap中除了设置VMA并将VMA->vmops指向vm_operations_结构外,什么也不做,只实现了打开-关闭和故障函数。当应用程序访问mmapped内存时,我得到一个页面错误,并调用my.fault函数。下面是使用vm_insert_pfn将虚拟地址映射到我想要的32MB中的任何物理地址

这里是我遇到的问题:在驱动程序中,如果我在init期间调用ioremap_cache(),当我访问这个内存中的数据时,我会从应用程序获得良好的缓存性能。但是,如果我不调用ioremap_cache(),我会发现对这些物理页的任何访问都会导致缓存丢失,并导致糟糕的性能。我查看了PTE,发现设置了虚拟地址->物理转换的PCD位,这意味着禁用了这些物理页面上的缓存。我们尝试在vma_PAGE_prot字段中设置_PAGE_CACHE_WB,并将重新映射pfn_范围与新的vma_PAGE_prot一起使用,但PCD位仍在PTE中设置

有人知道如何确保为该内存启用缓存吗?我不想对32MB使用ioremap_cache()的原因是,32位系统上的内核虚拟地址有限,我不想保留它们

建议:

  • 阅读
  • 使用调试PAT启动Linux
  • 在尝试设置内存wb()API之后,请检查/sys/kernel/debug/x86/pat\u memtype\u列表

  • 哦我还需要一个解决方案,因为我似乎无法成功地将ioremap_cache()映射到超过32 MB的物理内存。谢谢Scott。我确实找到了这个,并尝试设置内存,但似乎不起作用。无论如何,我通过调用ioremap_cache()和iounmap()来解决这个问题,调用vm_insert_pfn()等等。我问了更多的问题,看起来这些函数调用register_memtype(),它继续设置PCD位和PAT列表中的寄存器。没有其他导出的函数,驱动程序可以调用这些函数按请求设置PCD位。由于这是一个32位的问题,我们如上所述解决了它。