【发布时间】:2022-01-25 23:46:34
【问题描述】:
我正在寻找一种方法将内核的大页面 (2MiB) 映射拆分为更小的 (4KiB) 页表条目。到目前为止,我只遇到了函数set_memory_4k,它只在早期启动阶段有效(全局变量early_boot_irqs_disabled必须为真)。我有点不愿意禁用中断来调用这个函数,但我不知道有什么其他方法可以拆分 kernel(不是用户)页表。
目标是映射具有不同权限的单个 4KB 页面。但是,通过alloc_pages() 返回的页面通常是 2MB 映射的一部分。我确实没有可以选择使用任何其他分配器(vmalloc、kmalloc、memblock、...),所以我需要使用alloc_pages() 函数或其任何变体。
其他信息:
我知道现有的函数split_huge_page。不幸的是,这种方法不适用于代表内核内存的struct pages。其原因(根据LWN)是page->mapping字段,也就是拆分前的checked,需要非NULL。这不适用于内核页面,因此这种方法似乎也只适用于用户空间页面。
【问题讨论】:
标签: linux linux-kernel x86-64 mmu page-tables