我正在做一些 linux 内核工作,我正在同时迭代三个不同页目录的页表。当我开始需要映射页表时,我使用了 pte_offset_map
。但是,我意识到在启用高内存的情况下,此方法将不起作用,因为 pte_offset_map
将尝试使用相同的 kmap 插槽(pte_offset_map 在 linux 2.6.32 中使用 kmap_atomic
)。我看到有一个 pte_offset_map_nested
使用另一个 kmap_atomic
插槽。
但是,我需要同时映射三个不同的页表。我想到了一些只需要一次映射两个页表的解决方案(我可以来回交错并且同时只映射两个页表,或者在映射其他两个页表时临时复制一个页表,等等...... ) 但这些解决方案是不可取的。我虽然用 kmap_atomic(pmd_page(*pmd), KM_USER0)
手动映射第三个页表,但这种方法在不同的内核版本中似乎并不通用。但是,我确实相信这种方法在效率和简单性方面是最好的。
有没有关于如何处理这个问题的想法?
最佳答案
您可以使用vmalloc
的地址空间来映射任意页面。查看这些 API:
extern void vm_unmap_ram(const void *mem, unsigned int count);
extern void *vm_map_ram(struct page **pages, unsigned int count,
int node, pgprot_t prot);
关于c - 使用 pte_map_offset 映射页表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8208129/