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

Does kmalloc() reserve Copy-On-Write (COW) mappings?

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

kmalloc()并没有真正分配内存页,它比那更复杂。 kmalloc() 用于为小对象(小于页面大小)请求内存,并使用已经存在的内存页面管理这些请求,类似于 libc 的 malloc() 用来管理 user[=34 中的堆=] 程序。

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

kmalloc() 的调用根本没有真正保留内存,而只是管理已经保留的内存。因此,kmalloc() 返回的内存不需要像通过 mmap() 请求的页面通常那样的后续页面错误。

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

我相信这应该可以消除您的任何疑问。简短的回答是 kmalloc() 不会 "reserve the physical memory immediately" 因为它只是从 已经保留的 内存中分配一个对象。