[英]Splitting kernel huge page (THP) returned by alloc_pages()
我正在寻找一种方法将内核的大页面 (2MiB) 映射拆分为较小的 (4KiB) 页表条目。 到目前为止,我只遇到了 function set_memory_4k
,它只在早期启动阶段有效(全局变量early_boot_irqs_disabled
必须为真)。 我有点不愿意禁用中断来调用这个 function,但我不知道有任何其他方法可以拆分kernel (不是用户)页表。
目标是 map 个具有不同权限的 4KB 页面。 但是,通过alloc_pages()
返回的页面通常是 2MB 映射的一部分。 我没有使用任何其他分配器( vmalloc
、 kmalloc
、 memblock
……)的选项,因此我需要使用alloc_pages()
function 或其任何变体。
附加信息:
我知道现有的 function split_huge_page
。 不幸的是,这种方法不适用于表示 kernel memory 的struct page
。这样做的原因(根据LWN )是在拆分之前检查的page->mapping
字段需要非NULL
。 这不适用于 kernel 页面,因此这种方法似乎也只适用于用户空间页面。
来自linux/huge_mm.h
的split_huge_page()
function 似乎是您正在寻找的。 它是split_huge_page_to_list()
的包装器,它有一个解释其用法的文档注释。
你应该能够做这样的事情(你可能想仔细检查,我没有测试它):
#define ORDER 9
struct page *pages, *p;
int i;
pages = alloc_pages(GFP_KERNEL, ORDER);
if (!pages)
return -ENOMEM;
p = pages;
for (i = 0; i < (1 << ORDER); i++) {
if (PageHead(p)) {
err = split_huge_page(p);
if (err) {
// should be -EBUSY, handle error somehow
}
}
p++;
}
我不确定你的问题是否清楚。 我看到你需要的是split_huge_pmd
而不是split_huge_page
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.