原型: void *kmalloc(size_t size, int flags)
功能: 在设备驱动程序或者内核模块中动态开辟内存,不是用malloc
,而是kmalloc
、vmalloc
,或者用get_free_pages
直接申请页,释放内存用的是kfree
、vfree
或free_pages
。
kmalloc
函数返回的是虚拟地址(线性地址),kmalloc
特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA
的设备十分重要,而用vmalloc
分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA。
关于kmalloc
与vmalloc
、malloc
的一些总结
kmalloc
和vmalloc
分配的是内核的内存,malloc
分配的是用户的内存。kmalloc
保证分配的内存在==物理上是连续==的,kmalloc
分配的内存是位于0xBFFFFFFF - 0xFFFFFFFF
中,driver一般是用它来完成对DS的分配,更适合于类似设备驱动的程序来使用。vmalloc
保证的是在==虚拟地址空间上==的连续,vmalloc
则是位于物理地址非连续,虚地址连续区,起始位置由VMALLOL_START
来决定,一般作为交换区、模块的分配。kmalloc
能分配的大小有限,vmalloc
和malloc
能分配的大小相对较大(因为vmalloc
还可以处理交换空间)。- 内存只有在要被DMA访问的时候才需要物理上连续,
vmalloc
比kmalloc
要慢. vmalloc
使用的正确场合是分配一大块,连续的,只在软件中存在的,用于缓冲的内存区域。不能在微处理器之外使用。vmalloc
中调用了kmalloc(GFP—KERNEL)
,因此也不能应用于原子上下文。kmalloc
和kfree
管理内核段内分配的内存,这是真实地址已知的实际物理内存块。vmalloc
对应于vfree
,分配连续的虚拟内存,但是物理上不一定连续。kmalloc
分配内存是基于slab
,因此slab
的一些特性包括着色、对齐等都具备,性能较好,==物理地址和逻辑地址都是连续的。==