0

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

这是我遇到的问题:在驱动程序中,如果我在初始化期间调用 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 位系统上的内核虚拟地址有限,我不想持有它们。

4

1 回答 1

0

建议:

  1. 阅读linux/Documentation/x86/pat.txt
  2. 使用debugpat引导 Linux
  3. 尝试set_memory_wb() API 后,检查/sys/kernel/debug/x86/pat_memtype_list
于 2013-05-26T14:22:45.740 回答