[英]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.