【发布时间】:2019-05-10 10:49:11
【问题描述】:
我有一个 16 个 4K 物理页面的列表(由 struct page 表示),我想将它们收集到一个 64KB 的连续大页面中。这当然要在内核中完成。 现在我这样做如下(波纹管可能有错误,这只是为了想法):
struct page *huge_page = alloc_pages(gfp_flags, get_order(16*PAGE_SIZE));
char *gather_buff = (char *)kmap(huge_page);
for (i = 0; i < 16; i++) {
char* tmp_addr = (char *)kmap(small_pages_arr[i]);
memcpy(gather_buff + i*PAGE_SIZE, tmp_addr, PAGE_SIZE);
kunmap(small_pages_arr[i]);
}
kunmap(huge_page);
我担心 kmap/kunmap 在性能方面非常低效,想知道是否有其他方法可以做到这一点? (查看了 copy_on_write 以供参考,但必须承认在那里迷路了)
谢谢!
【问题讨论】:
标签: memory-management linux-kernel