繁体   English   中英

拆分 alloc_pages() 返回的 kernel 大页面(THP)

[英]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 映射的一部分。 没有使用任何其他分配器( vmallockmallocmemblock ……)的选项,因此我需要使用alloc_pages() function 或其任何变体。

附加信息:

我知道现有的 function split_huge_page 不幸的是,这种方法不适用于表示 kernel memory 的struct page 。这样做的原因(根据LWN )是在拆分之前检查page->mapping字段需要非NULL 这不适用于 kernel 页面,因此这种方法似乎也只适用于用户空间页面。

来自linux/huge_mm.hsplit_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM