kmalloc()、kzalloc()、vmalloc() 的共同特点是:
用于申请内核空间的内存;
内存以字节为单位进行分配;
所分配的内存虚拟地址上连续;
kmalloc()、kzalloc()、vmalloc() 的区别是:
kzalloc 是强制清零的 kmalloc 操作;(以下描述不区分 kmalloc 和 kzalloc)
kmalloc 分配的内存大小有限制(4MB),而 vmalloc 没有限制;
kmalloc 可以保证分配的内存物理地址是连续的,但是 vmalloc 不能保证;
kmalloc 分配内存的过程可以是原子过程(使用 GFP_ATOMIC),而 vmalloc 分配内存时则可能产生阻塞;
kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快;
使用场合:
一般情况下,内存只有在要被 DMA 访问的时候才需要物理上连续,但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用 vmalloc()。例如,当模块被动态加载到内核当中时,就把模块装载到由 vmalloc() 分配的内存上。对于需要对分配的内存清零操作的,可以直接利用kzalloc来申请。
=========================================================
注意:vmalloc() 和 vfree() 可以睡眠,因此不能从中断上下文调用
kzalloc() 对应的内存释放函数也是 kfree()
参考:
原文链接:https://blog.csdn.net/m0_37765662/article/details/107905103