2017-07-07 80 views
1

当我们malloc内存时,只有虚拟内存可用,它实际上指向零页。当我们试图写入malloced内存时,真正的物理内存将被分配,此时,将会有复制副本将从零页面复制到由页面错误映射的物理内存中。我的问题是,在Linux源代码中如何/如何实现零填充需求,我想禁用此功能来做一些测试。我想这可能发生在页面错误过程中,而不是brk()或mmap()。在Linux内核中如何实现零填充需求,以及我可以禁用它的位置?

类似主题与零填充需求相关。 ZFODCOW

+0

为什么要禁用它?如果是用于时间测试,也许你可以在进行时序测试之前强制写入时复制发生在malloc的内存中。 –

+0

Malloc内存发生在用户空间中,但写时复制发生在内核空间中。当这种情况发生时,我认为我不具备这种能力来控制它。 – Qinchen

+1

在'mm/page_alloc.c'中看到函数'prep_new_page()'。如果您将(条件)调用注释为'prep_zero_page()',那么页面应该保持未初始化。 – Ctx

回答

0

如果你希望你的用户空间进程分配实际内存每* ALLOC电话,我认为在未来的选项:

  • 如果是出于性能的考虑,你可以取代的malloc + memset的所有释放calloc电话所以进程总是会有一个真正的内存页面。但是,内核仍然可以合并一些内存页面。

  • 禁用内存过量使用,以便每个malloc此刻都会返回页面。这样,您的程序将无法分配比可用内存更多的内存(RAM +交换)。请参阅https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

+0

@Ctx给出的答案更符合我的回答,但仍然感谢您的回复。 – Qinchen

+0

当然,不客气! – eugenioperez

相关问题