我正在做一些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)
手动映射第三页表,但这种方法在不同的内核版本中似乎不太通用。但是,我确实认为这种方法在效率和简单性方面是最好的。
对于如何处理这个有什么想法吗?
答案 0 :(得分:0)
您可以使用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);