【问题标题】:Splitting kernel huge page (THP) returned by alloc_pages()拆分 alloc_pages() 返回的内核大页面 (THP)
【发布时间】:2022-01-25 23:46:34
【问题描述】:

我正在寻找一种方法将内核的大页面 (2MiB) 映射拆分为更小的 (4KiB) 页表条目。到目前为止,我只遇到了函数set_memory_4k,它只在早期启动阶段有效(全局变量early_boot_irqs_disabled必须为真)。我有点不愿意禁用中断来调用这个函数,但我不知道有什么其他方法可以拆分 kernel(不是用户)页表。

目标是映射具有不同权限的单个 4KB 页面。但是,通过alloc_pages() 返回的页面通常是 2MB 映射的一部分。我确实没有可以选择使用任何其他分配器(vmallockmallocmemblock、...),所以我需要使用alloc_pages() 函数或其任何变体。

其他信息:

我知道现有的函数split_huge_page。不幸的是,这种方法不适用于代表内核内存的struct pages。其原因(根据LWN)是page->mapping字段,也就是拆分前的checked,需要非NULL。这不适用于内核页面,因此这种方法似乎也只适用于用户空间页面。

【问题讨论】:

    标签: linux linux-kernel x86-64 mmu page-tables


    【解决方案1】:

    我不确定你的问题是否清楚。我知道你需要的是split_huge_pmd 而不是split_huge_page

    【讨论】:

    • split_huge_pmd 需要一个 vm_area_struct 指针/实例,它只存在于用户空间进程。由于这个函数需要一个VMA指针,它只能被用户空间进程调用,不能被alloc_pages返回的内核内存调用。
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多