我在x86系统上使用ubuntu 12.10 32位。我有物理内存(大约32MB,有时更多),它通过ACPI表作为设备进行枚举和保留,以便linux / OS无法使用它。我有一个用于此内存设备的Linux驱动程序。驱动程序实现mmap(),以便当进程调用mmap()时,驱动程序可以将此保留的物理内存映射到用户空间。我有时在mmap中什么都不做,除了设置VMA并将vma-> vmops指向vm_operations_struct,并且实现了open close和fault函数。当应用程序访问mmapped内存时,我收到页面错误,并调用我的.fault函数。这里使用vm_insert_pfn将虚拟地址映射到我想要的32MB中的任何物理地址。
以下是我遇到的问题:在驱动程序中,如果我在init期间调用ioremap_cache(),当我访问此内存中的数据时,我会从应用程序中获得良好的缓存性能。但是,如果我不调用ioremap_cache(),我会发现对这些物理页面的任何访问都会导致缓存未命中并提供可怕的性能。我查看了PTE并看到这些虚拟地址 - >物理转换的PCD位已设置,这意味着禁用了这些物理页面上的缓存。我们尝试在vma_page_prot字段中设置_PAGE_CACHE_WB,并且还将remap_pfn_range与新的vma_page_prot一起使用,但仍然在PTE中设置了PCD位。
有没有人知道如何确保为此内存启用缓存?我不想将ioremap_cache()用于32 MB的原因是因为32位系统上的内核虚拟地址有限,我不想保留它们。
答案 0 :(得分:0)
建议: