使用pte_map_offset映射页表

时间:2011-11-21 06:36:49

标签: c linux-kernel

我正在做一些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)手动映射第三页表,但这种方法在不同的内核版本中似乎不太通用。但是,我确实认为这种方法在效率和简单性方面是最好的。

对于如何处理这个有什么想法吗?

1 个答案:

答案 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);