簡體   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