c - 使用 pte_map_offset 映射页表

标签 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) 手动映射第三个页表,但这种方法在不同的内核版本中似乎并不通用。但是,我确实相信这种方法在效率和简单性方面是最好的。

有没有关于如何处理这个问题的想法?

最佳答案

您可以使用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/

相关文章:

c - 如何修复这个简单的 C 溢出?

c - 来自 "Linux kernel programming"的源代码示例

linux - kgdb 和以太网连接

c - 使用 Splice 将文件复制到标准输出

c++ - Linux 数据模型和原始类型大小

c - 软件pwm作为linux内核模块

c - 如何提高帧速率并减少 C 中的闪烁?

c++ - 编译时如何更改makefile诊断消息[GNU ARM GCC,Eclipse make.exe]

C动态加载库

c - 函数的返回值在 c 中各不相同