我的理解是kmalloc()
从匿名内存中分配。这实际上是立即保留物理内存,还是仅在发生写页面错误时才会发生?
kmalloc()
并没有真正分配内存页面,这要复杂得多。 kmalloc()
用于为小对象(小于页面大小)请求内存,并使用已经存在的内存页面管理这些请求,类似于libc的malloc()
在用户空间程序中管理堆的操作。
Linux内核中可以使用不同的分配器:SLAB,SLOB和SLUB。它们使用不同的方法实现相同的目标:在运行时为小对象管理内核内存的分配和释放。调用kmalloc()
可以使用这三个中的任何一个,具体取决于在内核中配置了哪个。
对kmalloc()
的调用实际上根本不保留内存,而是仅管理已经保留的内存。因此,kmalloc()
返回的内存不需要后续的页面错误,就像通常通过mmap()
请求的页面一样。
写时复制(CoW)是一个不同的概念。尽管它仍然是由页面错误触发的,但是CoW是内核用来节省共享现有映射直到其被修改的空间的一种机制。在新分配的内存页面上触发故障时,不会发生这种情况。 CoW的一个很好的例子是调用fork
系统调用时发生的情况:子进程的进程内存不会立即被复制,而是将现有页面标记为CoW,并且复制仅在第一次尝试写入时发生。 >
我相信这应该清除您的任何疑问。简短的答案是,kmalloc()
不会“立即保留物理内存”,因为它只是从已经保留