kmalloc()是否保留了Copy-On-Write(COW)的映射?

问题描述 投票:0回答:1

我的理解是 kmalloc() 从匿名内存中分配。这是否真的会立即保留物理内存,还是只有在发生写页故障时才会发生?

linux memory-management linux-kernel virtual-memory
1个回答
0
投票

kmalloc() kalloc()并不是真的分配内存页,它比这更复杂。kmalloc() 是用来请求小对象的内存(小于页面大小),并使用已有的内存页来管理这些请求,类似于libc的 malloc() 来管理用户空间程序中的堆。

在Linux内核中,有不同的分配器可以使用。SLAB, SLOBSLUB. 这些使用不同的方法来实现相同的目标:在运行时为小对象管理内核内存的分配和重新分配。调用 kmalloc() 可以使用三者中的任何一个,这取决于内核中配置的是哪一个。

调用 kmalloc() 并不是真正的保留内存,而只是管理已经保留的内存。因此由 kmalloc() 不需要像通过以下方式请求的页面那样出现后续的页面故障 mmap() 通常会。

Copy on Write(CoW)是一个不同的概念。虽然它仍然是通过页面故障触发的,但是CoW是内核用来节省空间的机制,共享现有的映射,直到它们被修改。它不是在新分配的内存页上触发故障时的情况。CoW的一个很好的例子是当 fork syscall被调用后:子进程的进程内存并没有立即被复制,相反,现有的页面被标记为CoW,而且复制只发生在第一次尝试写入时。

我相信这应该可以消除你的疑问。简单的回答是 kmalloc() 并没有 "立即保留物理内存",因为它仅仅是从 已有 记忆。

© www.soinside.com 2019 - 2024. All rights reserved.