【问题标题】:how to copy from one physical page to another in kernel如何在内核中从一个物理页面复制到另一个物理页面
【发布时间】: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


    【解决方案1】:

    我相信 kmap/kunmap 在 x86_64 系统上相当于一个简单的指针算术运算,所以它应该不会显着影响性能。

    在这个问题中有一些关于 64 位系统中高内存的更多细节:Why does high-memory not exist for 64-bit cpu?

    【讨论】:

    • 谢谢!我不确定我是否理解它怎么可能只是指针算术。 kmap/unmap 不应该涉及页表更新吗?找到免费的 PTE,更新映射,将页面更新为映射等......
    • 因为64位系统没有high mem区,所以所有的物理页都提前映射到内核页表中。
    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多