C 使用pte_map_偏移量映射页表

C 使用pte_map_偏移量映射页表,c,linux-kernel,C,Linux Kernel,我正在做一些linux内核的工作,同时迭代三个不同页面目录的页面表。当我开始需要映射页面表时,我使用了pte\u offset\u map。但是,我意识到,在启用高内存的情况下,此方法将不起作用,因为pte_offset_map将尝试使用相同的kmap插槽(pte_offset_map在linux 2.6.32中使用kmap_atomic)。我看到有一个嵌套的pte_offset_map_使用另一个kmap_原子插槽 但是,我需要同时映射三个不同的页面表。我曾想到一些解决方案,一次只需映射两个页

我正在做一些linux内核的工作,同时迭代三个不同页面目录的页面表。当我开始需要映射页面表时,我使用了
pte\u offset\u map
。但是,我意识到,在启用高内存的情况下,此方法将不起作用,因为
pte_offset_map
将尝试使用相同的kmap插槽(pte_offset_map在linux 2.6.32中使用
kmap_atomic
)。我看到有一个嵌套的
pte_offset_map_
使用另一个
kmap_原子
插槽

但是,我需要同时映射三个不同的页面表。我曾想到一些解决方案,一次只需映射两个页面表(我可以前后交错,同时只映射两个页面表,或者在映射其他两个页面表时临时复制一个页面表,等等),但这些解决方案是不可取的。我想用
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);