kmalloc
和 vmalloc
是 Linux 内核中的两种内存分配方法,它们都用于为内核分配内存,但它们在使用和管理内存方面存在一些重要差异。下面我们详细讨论这两种内存分配方法的异同。
相同点:
- 都是内核空间的内存分配方法。
- 都可以用于动态分配内存,内存大小可以在运行时指定。
- 分配的内存只能被内核使用,用户空间不能直接访问。
不同点:
-
连续性:
kmalloc
分配的内存是物理上连续的,而vmalloc
分配的内存只是虚拟上连续的。这意味着kmalloc
分配的内存可用于需要物理连续内存的硬件设备,而vmalloc
分配的内存仅适用于不需要物理连续内存的场景。 -
分配大小: 由于
kmalloc
需要分配物理连续的内存,因此在分配大块内存时可能会失败(因为找不到足够大的连续物理内存区域)。相比之下,vmalloc
可以分配较大的内存块,因为它使用虚拟地址空间,只要有足够的可用物理内存即可。 -
分配速度: 由于
kmalloc
在物理内存上连续,通常分配速度较快。而vmalloc
在分配内存时需要在虚拟地址空间中查找可用的区域并建立页表映射,所以分配速度相对较慢。 -
内存管理:
kmalloc
分配的内存来自于内核的伙伴系统(Buddy System),该系统管理物理内存页框。而vmalloc
分配的内存来自于虚拟地址空间,它使用页表将虚拟地址映射到物理内存。 -
内存释放:
kmalloc
分配的内存释放后可以立即被重新分配给其他请求,而vmalloc
分配的内存释放后不会立即回收物理内存,而是保留在虚拟地址空间,直到下一次分配。
总结起来,kmalloc
更适用于需要物理连续内存且分配速度要求较高的场景,而 vmalloc
更适用于需要较大内存块且物理连续性要求不高的场景。根据实际需求选择合适的内存分配方法是内核编程中的一个重要考虑因素。
【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~