kmalloc()是否保留写时复制(COW)映射?

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

我的理解是kmalloc()从匿名内存中分配。这实际上是立即保留物理内存,还是仅在发生写页面错误时才会发生?

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

kmalloc()并没有真正分配内存页面,这要复杂得多。 kmalloc()用于为小对象(小于页面大小)请求内存,并使用已经存在的内存页面管理这些请求,类似于libc的malloc()在用户空间程序中管理堆的操作。

Linux内核中可以使用不同的分配器:SLABSLOBSLUB。它们使用不同的方法实现相同的目标:在运行时为小对象管理内核内存的分配和释放。调用kmalloc()可以使用这三个中的任何一个,具体取决于在内核中配置了哪个。

kmalloc()的调用实际上根本不保留内存,而是仅管理已经保留的内存。因此,kmalloc()返回的内存不需要后续的页面错误,就像通常通过mmap()请求的页面一样。

写时复制(CoW)是一个不同的概念。尽管它仍然是由页面错误触发的,但是CoW是内核用来节省共享现有映射直到其被修改的空间的一种机制。在新分配的内存页面上触发故障时,不会发生这种情况。 CoW的一个很好的例子是调用fork系统调用时发生的情况:子进程的进程内存不会立即被复制,而是将现有页面标记为CoW,并且复制仅在第一次尝试写入时发生。 >

我相信这应该清除您的任何疑问。简短的答案是,kmalloc()不会“立即保留物理内存”,因为它只是从已经保留

内存中分配一个对象。
© www.soinside.com 2019 - 2024. All rights reserved.