kmalloc函数功能描述:kmalloc( )分配在物理上连续的内存,虚拟地址自然也是连续的,它基于slab分配实际上存在的连续的内存。
kmalloc文件包含
#include<linux/slab.h>
kmalloc函数定义
在内核源码中的位置:linux-3.19.3/include/linux/slab.h
函数定义格式:
static __always_inline void *kmalloc(size_t size, gfp_t f lags)
kmalloc输入参数说明
size
:是指要分配的内存的字节数。flags
:是分配标志,它提供了多种kmalloc( )的行为。其中分配标志(flags)的常见取值参考alloc_pages( )函数的分析。
kmalloc返回参数说明
kmalloc( )函数返回一个指向分配的内存块起始地址的地址指针。
kmalloc实例解析
编写测试文件:kmalloc.c
头文件及全局变量声明如下:
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int __init kmalloc_init(void);
static void __exit kmalloc_exit(void);
#define MEM_KMALLOC_SIZE 8092
char * mem_spvm;
模块初始化函数:
int __init kmalloc_init(void)
{
mem_spvm = (char *)kmalloc( MEM_KMALLOC_SIZE, GFP_KERNEL);
if(mem_spvm == NULL )
printk("kmalloc failed! \n");
else
/*输出分配的内存空间的起始地址*/
printk("kmalloc successfully! \naddr = 0x%lx\n", (unsigned long)mem_spvm);
return 0;
}
模块退出函数:
void __exit kmalloc_exit(void)
{
if(mem_spvm ! = NULL)
{
kfree(mem_spvm);
printk("kfree ok! \n");
}
printk("exit ! \n");
}
模块初始化及退出函数调用:
module_init(kmalloc_init);
module_exit(kmalloc_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod kmalloc.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。
执行命令rmmod kmalloc.ko卸载模块,由命令dmesg -c显示系统信息如图所示。
结果分析:
插入模块时测试程序调用kmalloc( )函数,由字符指针mem_spvm接收kmalloc( )函数的返回值,即已分配的连续内存块的起始地址。由输出信息可知该起始地址为0xffff8800a5dec000。
卸载模块时调用kfree( )函数释放起始地址为0xffff8800a5dec000,大小为MEM_KMALOC_SIZE的内存块。